From http://www.jwz.org/xscreensaver/xscreensaver-5.31.tar.gz
authorZygo Blaxell <zblaxell@faye.furryterror.org>
Sun, 16 Nov 2014 06:50:59 +0000 (01:50 -0500)
committerZygo Blaxell <zblaxell@faye.furryterror.org>
Sun, 16 Nov 2014 06:51:31 +0000 (01:51 -0500)
-rw-r--r-- 1 zblaxell zblaxell 10569562 Nov 15 18:51 xscreensaver-5.31.tar.gz
1b023a3b01f1f23aa136d13c37f79c0c01c3f1e6  xscreensaver-5.31.tar.gz

461 files changed:
Makefile.in
OSX/Makefile
OSX/README
OSX/SaverListController.h
OSX/SaverListController.m
OSX/SaverRunner.h
OSX/SaverRunner.m
OSX/SaverRunner.plist
OSX/Updater.plist
OSX/XScreenSaver.plist
OSX/XScreenSaverConfigSheet.m
OSX/XScreenSaverGLView.m
OSX/XScreenSaverView.h
OSX/XScreenSaverView.m
OSX/bindist.rtf
OSX/build-fntable.pl
OSX/iSaverRunner.plist
OSX/iSaverRunner29t.png [deleted file]
OSX/iSaverRunner57t.png [new file with mode: 0644]
OSX/installer.sh
OSX/ios-function-table.m
OSX/iosgrabimage.m
OSX/jwxyz.h
OSX/jwxyz.m
OSX/update-thumbnail.pl
OSX/updates.xml
OSX/xscreensaver.xcconfig [new file with mode: 0644]
README
android/Makefile [new file with mode: 0644]
android/XScreenSaverGLView.c [new file with mode: 0644]
android/XScreenSaverView.c [new file with mode: 0644]
android/glue.c [new file with mode: 0644]
android/jwxyz-timers.h [new file with mode: 0644]
android/jwxyz.c [new file with mode: 0644]
android/jwxyz.h [new file with mode: 0644]
android/project/GLWallpaperService/AndroidManifest.xml [new file with mode: 0644]
android/project/GLWallpaperService/LICENSE [new file with mode: 0644]
android/project/GLWallpaperService/NOTICE [new file with mode: 0644]
android/project/GLWallpaperService/build.xml [new file with mode: 0644]
android/project/GLWallpaperService/default.properties [new file with mode: 0644]
android/project/GLWallpaperService/local.properties [new file with mode: 0644]
android/project/GLWallpaperService/project.properties [new file with mode: 0644]
android/project/GLWallpaperService/readme-contribute.txt [new file with mode: 0644]
android/project/GLWallpaperService/readme.txt [new file with mode: 0644]
android/project/GLWallpaperService/res/drawable-hdpi/icon.png [new file with mode: 0644]
android/project/GLWallpaperService/res/drawable-ldpi/icon.png [new file with mode: 0644]
android/project/GLWallpaperService/res/drawable-mdpi/icon.png [new file with mode: 0644]
android/project/GLWallpaperService/res/layout/main.xml [new file with mode: 0644]
android/project/GLWallpaperService/res/values/strings.xml [new file with mode: 0644]
android/project/GLWallpaperService/src/net/rbgrn/android/glwallpaperservice/GLWallpaperService.java [new file with mode: 0644]
android/project/xscreensaver/AndroidManifest.xml [new file with mode: 0644]
android/project/xscreensaver/build.xml [new file with mode: 0644]
android/project/xscreensaver/jni/Android.mk [new file with mode: 0644]
android/project/xscreensaver/jni/Application.mk [new file with mode: 0644]
android/project/xscreensaver/jni/xscreensaver [new symlink]
android/project/xscreensaver/local.properties [new file with mode: 0644]
android/project/xscreensaver/project.properties [new file with mode: 0644]
android/project/xscreensaver/res/drawable-hdpi/icon.png [new file with mode: 0644]
android/project/xscreensaver/res/drawable-ldpi/icon.png [new file with mode: 0644]
android/project/xscreensaver/res/drawable-mdpi/icon.png [new file with mode: 0644]
android/project/xscreensaver/res/drawable/hilbert.png [new file with mode: 0644]
android/project/xscreensaver/res/drawable/sproingies.png [new file with mode: 0644]
android/project/xscreensaver/res/drawable/stonerview.png [new file with mode: 0644]
android/project/xscreensaver/res/drawable/superquadrics.png [new file with mode: 0644]
android/project/xscreensaver/res/drawable/thumbnail.png [new file with mode: 0644]
android/project/xscreensaver/res/layout/main.xml [new file with mode: 0644]
android/project/xscreensaver/res/values/settings.xml [new file with mode: 0644]
android/project/xscreensaver/res/values/strings.xml [new file with mode: 0644]
android/project/xscreensaver/res/xml/glwallpapertest.xml [new file with mode: 0644]
android/project/xscreensaver/res/xml/hilbert.xml [new file with mode: 0644]
android/project/xscreensaver/res/xml/hilbert_settings.xml [new file with mode: 0644]
android/project/xscreensaver/res/xml/sproingies.xml [new file with mode: 0644]
android/project/xscreensaver/res/xml/sproingies_settings.xml [new file with mode: 0644]
android/project/xscreensaver/res/xml/stonerview.xml [new file with mode: 0644]
android/project/xscreensaver/res/xml/stonerview_settings.xml [new file with mode: 0644]
android/project/xscreensaver/res/xml/superquadrics.xml [new file with mode: 0644]
android/project/xscreensaver/res/xml/superquadrics_settings.xml [new file with mode: 0644]
android/project/xscreensaver/src/org/jwz/xscreensaver/ARenderer.java [new file with mode: 0644]
android/project/xscreensaver/src/org/jwz/xscreensaver/BufferFactory.java [new file with mode: 0644]
android/project/xscreensaver/src/org/jwz/xscreensaver/CallNative.java [new file with mode: 0644]
android/project/xscreensaver/src/org/jwz/xscreensaver/XscreensaverApp.java [new file with mode: 0644]
android/project/xscreensaver/src/org/jwz/xscreensaver/gen/HilbertService.java [new file with mode: 0644]
android/project/xscreensaver/src/org/jwz/xscreensaver/gen/HilbertSettings.java [new file with mode: 0644]
android/project/xscreensaver/src/org/jwz/xscreensaver/gen/HilbertWallpaper.java [new file with mode: 0644]
android/project/xscreensaver/src/org/jwz/xscreensaver/gen/SproingiesService.java [new file with mode: 0644]
android/project/xscreensaver/src/org/jwz/xscreensaver/gen/SproingiesSettings.java [new file with mode: 0644]
android/project/xscreensaver/src/org/jwz/xscreensaver/gen/SproingiesWallpaper.java [new file with mode: 0644]
android/project/xscreensaver/src/org/jwz/xscreensaver/gen/StonerviewService.java [new file with mode: 0644]
android/project/xscreensaver/src/org/jwz/xscreensaver/gen/StonerviewSettings.java [new file with mode: 0644]
android/project/xscreensaver/src/org/jwz/xscreensaver/gen/StonerviewWallpaper.java [new file with mode: 0644]
android/project/xscreensaver/src/org/jwz/xscreensaver/gen/SuperquadricsService.java [new file with mode: 0644]
android/project/xscreensaver/src/org/jwz/xscreensaver/gen/SuperquadricsSettings.java [new file with mode: 0644]
android/project/xscreensaver/src/org/jwz/xscreensaver/gen/SuperquadricsWallpaper.java [new file with mode: 0644]
config.h.in
configure
configure.in
driver/Makefile.in
driver/XScreenSaver.ad.in
driver/XScreenSaver_ad.h
driver/demo-Gtk-conf.c
driver/windows.c
driver/xscreensaver-demo.glade2.in [new file with mode: 0644]
driver/xscreensaver-text
driver/xscreensaver.c
hacks/Makefile.in
hacks/abstractile.c
hacks/analogtv.c
hacks/apple2-main.c
hacks/binaryring.c [new file with mode: 0644]
hacks/binaryring.man [new file with mode: 0644]
hacks/blitspin.c
hacks/bumps.c
hacks/check-configs.pl
hacks/compile_axp.com
hacks/compile_decc.com
hacks/config/README
hacks/config/abstractile.xml
hacks/config/anemone.xml
hacks/config/anemotaxis.xml
hacks/config/ant.xml
hacks/config/antinspect.xml
hacks/config/antmaze.xml
hacks/config/antspotlight.xml
hacks/config/apollonian.xml
hacks/config/apple2.xml
hacks/config/atlantis.xml
hacks/config/attraction.xml
hacks/config/atunnel.xml
hacks/config/barcode.xml
hacks/config/binaryring.xml [new file with mode: 0644]
hacks/config/blaster.xml
hacks/config/blinkbox.xml
hacks/config/blitspin.xml
hacks/config/blocktube.xml
hacks/config/boing.xml
hacks/config/bouboule.xml
hacks/config/bouncingcow.xml
hacks/config/boxed.xml
hacks/config/boxfit.xml
hacks/config/braid.xml
hacks/config/bsod.xml
hacks/config/bubble3d.xml
hacks/config/bubbles.xml
hacks/config/bumps.xml
hacks/config/cage.xml
hacks/config/carousel.xml
hacks/config/ccurve.xml
hacks/config/celtic.xml
hacks/config/circuit.xml
hacks/config/cityflow.xml [new file with mode: 0644]
hacks/config/cloudlife.xml
hacks/config/companioncube.xml
hacks/config/compass.xml
hacks/config/coral.xml
hacks/config/crackberg.xml
hacks/config/critical.xml
hacks/config/crystal.xml
hacks/config/cube21.xml
hacks/config/cubenetic.xml
hacks/config/cubestorm.xml
hacks/config/cubicgrid.xml
hacks/config/cwaves.xml
hacks/config/cynosure.xml
hacks/config/dangerball.xml
hacks/config/decayscreen.xml
hacks/config/deco.xml
hacks/config/deluxe.xml
hacks/config/demon.xml
hacks/config/discrete.xml
hacks/config/distort.xml
hacks/config/dnalogo.xml
hacks/config/drift.xml
hacks/config/endgame.xml
hacks/config/engine.xml
hacks/config/epicycle.xml
hacks/config/eruption.xml
hacks/config/euler2d.xml
hacks/config/extrusion.xml
hacks/config/fadeplot.xml
hacks/config/fiberlamp.xml
hacks/config/fireworkx.xml
hacks/config/flag.xml
hacks/config/flame.xml
hacks/config/flipflop.xml
hacks/config/flipscreen3d.xml
hacks/config/fliptext.xml
hacks/config/flow.xml
hacks/config/fluidballs.xml
hacks/config/flurry.xml
hacks/config/flyingtoasters.xml
hacks/config/fontglide.xml
hacks/config/forest.xml
hacks/config/fuzzyflakes.xml
hacks/config/galaxy.xml
hacks/config/gears.xml
hacks/config/geodesic.xml
hacks/config/geodesicgears.xml [new file with mode: 0644]
hacks/config/gflux.xml
hacks/config/glblur.xml
hacks/config/glcells.xml
hacks/config/gleidescope.xml
hacks/config/glforestfire.xml
hacks/config/glhanoi.xml
hacks/config/glknots.xml
hacks/config/glmatrix.xml
hacks/config/glplanet.xml
hacks/config/glschool.xml
hacks/config/glslideshow.xml
hacks/config/glsnake.xml
hacks/config/gltext.xml
hacks/config/goop.xml
hacks/config/grav.xml
hacks/config/greynetic.xml
hacks/config/halftone.xml
hacks/config/halo.xml
hacks/config/helix.xml
hacks/config/hexadrop.xml
hacks/config/hilbert.xml
hacks/config/hopalong.xml
hacks/config/hyperball.xml
hacks/config/hypercube.xml
hacks/config/hypertorus.xml
hacks/config/hypnowheel.xml
hacks/config/ifs.xml
hacks/config/imsmap.xml
hacks/config/interaggregate.xml
hacks/config/interference.xml
hacks/config/intermomentary.xml
hacks/config/jigglypuff.xml
hacks/config/jigsaw.xml
hacks/config/juggle.xml
hacks/config/juggler3d.xml
hacks/config/julia.xml
hacks/config/kaleidescope.xml
hacks/config/kaleidocycle.xml
hacks/config/klein.xml
hacks/config/kumppa.xml
hacks/config/lament.xml
hacks/config/laser.xml
hacks/config/lavalite.xml
hacks/config/lcdscrub.xml
hacks/config/lightning.xml
hacks/config/lisa.xml
hacks/config/lissie.xml
hacks/config/lmorph.xml
hacks/config/lockward.xml
hacks/config/loop.xml
hacks/config/m6502.xml
hacks/config/maze.xml
hacks/config/memscroller.xml
hacks/config/menger.xml
hacks/config/metaballs.xml
hacks/config/mirrorblob.xml
hacks/config/mismunch.xml
hacks/config/moebius.xml
hacks/config/moebiusgears.xml
hacks/config/moire.xml
hacks/config/moire2.xml
hacks/config/molecule.xml
hacks/config/morph3d.xml
hacks/config/mountain.xml
hacks/config/munch.xml
hacks/config/nerverot.xml
hacks/config/noof.xml
hacks/config/noseguy.xml
hacks/config/pacman.xml
hacks/config/pedal.xml
hacks/config/penetrate.xml
hacks/config/penrose.xml
hacks/config/petri.xml
hacks/config/phosphor.xml
hacks/config/photopile.xml
hacks/config/piecewise.xml
hacks/config/pinion.xml
hacks/config/pipes.xml
hacks/config/polyhedra.xml
hacks/config/polyominoes.xml
hacks/config/polytopes.xml
hacks/config/pong.xml
hacks/config/popsquares.xml
hacks/config/projectiveplane.xml
hacks/config/providence.xml
hacks/config/pulsar.xml
hacks/config/pyro.xml
hacks/config/qix.xml
hacks/config/quasicrystal.xml
hacks/config/queens.xml
hacks/config/rd-bomb.xml
hacks/config/ripples.xml
hacks/config/rocks.xml
hacks/config/rorschach.xml
hacks/config/rotor.xml
hacks/config/rotzoomer.xml
hacks/config/rubik.xml
hacks/config/rubikblocks.xml
hacks/config/sballs.xml
hacks/config/shadebobs.xml
hacks/config/sierpinski.xml
hacks/config/sierpinski3d.xml
hacks/config/skytentacles.xml
hacks/config/slidescreen.xml
hacks/config/slip.xml
hacks/config/sonar.xml
hacks/config/speedmine.xml
hacks/config/sphere.xml
hacks/config/spheremonics.xml
hacks/config/spiral.xml
hacks/config/spotlight.xml
hacks/config/sproingies.xml
hacks/config/squiral.xml
hacks/config/stairs.xml
hacks/config/starfish.xml
hacks/config/starwars.xml
hacks/config/stonerview.xml
hacks/config/strange.xml
hacks/config/substrate.xml
hacks/config/superquadrics.xml
hacks/config/surfaces.xml
hacks/config/swirl.xml
hacks/config/t3d.xml
hacks/config/tangram.xml
hacks/config/tessellimage.xml
hacks/config/thornbird.xml
hacks/config/timetunnel.xml
hacks/config/topblock.xml
hacks/config/triangle.xml
hacks/config/tronbit.xml
hacks/config/truchet.xml
hacks/config/twang.xml
hacks/config/unknownpleasures.xml
hacks/config/vermiculate.xml
hacks/config/vidwhacker.xml
hacks/config/vines.xml
hacks/config/voronoi.xml
hacks/config/wander.xml
hacks/config/webcollage.xml
hacks/config/whirlwindwarp.xml
hacks/config/whirlygig.xml
hacks/config/winduprobot.xml
hacks/config/worm.xml
hacks/config/wormhole.xml
hacks/config/xanalogtv.xml
hacks/config/xflame.xml
hacks/config/xjack.xml
hacks/config/xlyap.xml
hacks/config/xmatrix.xml
hacks/config/xrayswarm.xml
hacks/config/xspirograph.xml
hacks/config/zoom.xml
hacks/decayscreen.c
hacks/distort.c
hacks/flame.c
hacks/fontglide.c
hacks/fpsI.h
hacks/fuzzyflakes.man
hacks/glx/Makefile.in
hacks/glx/carousel.c
hacks/glx/circuit.c
hacks/glx/cityflow.c [new file with mode: 0644]
hacks/glx/cityflow.man [new file with mode: 0644]
hacks/glx/crackberg.c
hacks/glx/cubestorm.c
hacks/glx/engine.c
hacks/glx/fliptext.c
hacks/glx/font-ximage.c [deleted file]
hacks/glx/font-ximage.h [deleted file]
hacks/glx/fps-gl.c
hacks/glx/gears.c
hacks/glx/geodesicgears.c [new file with mode: 0644]
hacks/glx/geodesicgears.man [new file with mode: 0644]
hacks/glx/glknots.c
hacks/glx/gllist.h
hacks/glx/glmatrix.c
hacks/glx/glplanet.c
hacks/glx/glplanet.man
hacks/glx/glslideshow.c
hacks/glx/glsnake.c
hacks/glx/gltext.c
hacks/glx/gltext.man
hacks/glx/gltrackball.c
hacks/glx/glxfonts.c [deleted file]
hacks/glx/glxfonts.h [deleted file]
hacks/glx/involute.c
hacks/glx/involute.h
hacks/glx/jigsaw.c
hacks/glx/juggler3d.c
hacks/glx/jwzgles.c
hacks/glx/lament.c
hacks/glx/lockward.c
hacks/glx/moebiusgears.c
hacks/glx/molecule.c
hacks/glx/photopile.c
hacks/glx/pinion.c
hacks/glx/polyhedra-gl.c
hacks/glx/quasicrystal.c
hacks/glx/sonar.c
hacks/glx/sphere.c
hacks/glx/spheremonics.c
hacks/glx/sproingies.c
hacks/glx/starwars.c
hacks/glx/stonerview-move.c
hacks/glx/stonerview-move.h
hacks/glx/stonerview-view.c
hacks/glx/stonerview.h
hacks/glx/tangram.c
hacks/glx/texfont.c
hacks/glx/texfont.h
hacks/glx/tronbit.c
hacks/glx/tube.c
hacks/glx/winduprobot.c
hacks/glx/xlock-gl-utils.c
hacks/images/earth.xpm
hacks/images/earth_night.xpm [new file with mode: 0644]
hacks/ljlatest
hacks/memscroller.c
hacks/munge-ad.pl
hacks/noseguy.c
hacks/phosphor.c
hacks/rd-bomb.c
hacks/recanim.c [new file with mode: 0644]
hacks/recanim.h [new file with mode: 0644]
hacks/ripples.c
hacks/rotzoomer.c
hacks/screenhack.c
hacks/screenhackI.h
hacks/slidescreen.c
hacks/spotlight.c
hacks/starfish.c
hacks/substrate.c
hacks/tessellimage.c
hacks/twang.c
hacks/webcollage
hacks/webcollage-cocoa.m
hacks/webcollage-helper-cocoa.m
hacks/whirlwindwarp.c
hacks/xlockmore.c
hacks/xlockmore.h
hacks/xlockmoreI.h
hacks/xmatrix.c
hacks/xml2man.pl
hacks/zoom.c
po/POTFILES.in
setup.com
utils/Makefile.in
utils/async_netdb.c [new file with mode: 0644]
utils/async_netdb.h [new file with mode: 0644]
utils/compile_axp.com
utils/compile_decc.com
utils/grabclient.c
utils/resources.c
utils/textclient.c
utils/thread_util.c
utils/thread_util.h
utils/utf8wc.c [new file with mode: 0644]
utils/utf8wc.h [new file with mode: 0644]
utils/utils.h
utils/version.h
utils/xft.c [new file with mode: 0644]
utils/xft.h [new file with mode: 0644]
xscreensaver.spec
xscreensaver.xcodeproj/project.pbxproj

index 1d29b54b009833b4e775f45557f2775b087cbf46..4be400dfb1e6ccf31473a85bd5d932f9570256cc 100644 (file)
@@ -7,8 +7,7 @@ VPATH           = @srcdir@
 
 SHELL          = /bin/sh
 SUBDIRS        = utils driver hacks hacks/glx po
-#SUBDIRS       = utils driver hacks hacks/glx
-SUBDIRS2       = $(SUBDIRS) OSX
+SUBDIRS2       = $(SUBDIRS) OSX android
 TARFILES       = README README.hacking README.VMS INSTALL \
                  configure configure.in Makefile.in config.h.in \
                  config.h-vms install-sh setup.com config.guess aclocal.m4 \
@@ -326,10 +325,10 @@ www::
     fi ;                                                                   \
   fi ;                                                                     \
                                                                            \
-  git commit -a -m "$$VERS" . ;                                                    \
-  git tag -a "v$$VERS" -m "$$VERS" . ;                                     \
+  git tag -a "v$$VERS" -m "$$VERS" ;                                       \
+  git commit -m "$$VERS" . ;                                               \
                                                                            \
-  ( cd $$DEST ;        git pull . ) ;                                              \
+  ( cd $$DEST ;        git pull ) ;                                                \
                                                                            \
   cp -p $$NAME $$DNAME ;                                                   \
   cp -p $$NAME2 $$DNAME2 ;                                                 \
@@ -372,8 +371,8 @@ www::
     exit 1 ;                                                               \
   fi ;                                                                     \
                                                                            \
-  git commit -m "$$VERS" . ;                                               \
   git tag -a "v$$VERS" -m "$$VERS" ;                                       \
+  git commit -m "$$VERS" . ;                                               \
   git push ;                                                               \
 
 
index 5467023424cbeda9f3bddd11157abd0946d2241e..bfbf61f2139d2cd3ba32e7592f678796104e29f1 100644 (file)
@@ -259,13 +259,13 @@ dmg::
    for r in $$retired ; do                                                   \
     if [ "$$ff" = "$$r" ]; then ok=no ; fi ;                                 \
    done ;                                                                    \
-   DSTNAME="" ;                                                                      \
    if [ "$$f2" = "XScreenSaverUpdater.app" ]; then                           \
-     DSTNAME=".$$f2" ;                                                       \
-   fi ;                                                                              \
-   if [ "$$ok" = yes ]; then                                                 \
-    echo + cp -pR "$$f" "$$DST/$$DSTNAME" ;                                  \
-           cp -pR "$$f" "$$DST/$$DSTNAME" ;                                  \
+    DST_HACK="XScreenSaver.updater" ;                                        \
+    echo + tar ... "$$DST/$$DST_HACK" ;                                              \
+    ( cd $$SRC ; tar -czf - "$$f2" ) > "$$DST/$$DST_HACK" ;                  \
+   elif [ "$$ok" = yes ]; then                                               \
+    echo + cp -pR "$$f" "$$DST/" ;                                           \
+           cp -pR "$$f" "$$DST/" ;                                           \
    else                                                                              \
     echo skipping "$$f" ;                                                    \
    fi ;                                                                              \
index d1eb22590516f9d2fb7c059459c73d6e1ed88c77..6a158c756186fddea3a0b5f2f9822d553554058f 100644 (file)
@@ -6,9 +6,9 @@ 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.
 
-To build these programs, XCode 2.4 or later is required.
-To run them, MacOS 10.4.0 or later is required.
-
+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.
 
 This is how you add a new screen saver to the Xcode project. It's a
 ridiculously long list of steps!
@@ -32,9 +32,8 @@ ridiculously long list of steps!
  16: Put a 200x150 screen shot in ~/www/xscreensaver/screenshots/
  17: ln -s ../../src/xscreensaver/OSX/build/Debug/NEW.saver \
            ~/Library/Screen\ Savers/
- 18: Build "XScreenSaver-iOS" once. then:
-     cd ~/src/xscreensaver/OSX ; make ios-function-table.m
-     and build it again.
- 19: git add xscreensaver.xcodeproj/xcuserdata/*/xcschemes/*.xcscheme
- 20: Don't forget to create a man page from the XML with xml2man.pl,
+ 18: git add xscreensaver.xcodeproj/xcuserdata/*/xcschemes/*.xcscheme
+ 19: Don't forget to create a man page from the XML with xml2man.pl,
      and update Makefile.in.
+ 20: Make a video: -record-animation 3600 -delay 1 -geom 1920x1080+128+64
+     ./upload-video.pl NAME
index fef8a78ef301b5e0f613284214cb0ea82d98d8bd..9b46133517ccecc823f3d17b437798d4fc6f4c21 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2012 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2012-2014 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
 
 #import <UIKit/UIKit.h>
 
-@interface SaverListController : UITableViewController {
+@interface SaverListController : UITableViewController <UISearchBarDelegate> {
 
   int active_section_count;
   NSMutableArray *list_by_letter[26];  // 27 to get "#" after "Z".
   NSMutableArray *letter_sections;
   NSMutableArray *section_titles;
+  NSArray *names;
   NSDictionary *descriptions;
 
   int tap_count;
@@ -29,7 +30,6 @@
 }
 
 - (id)initWithNames:(NSArray *)names descriptions:(NSDictionary *)descs;
-- (void) reload:(NSArray *)names descriptions:(NSDictionary *)descs;
 - (void) scrollTo:(NSString *)name;
 @end
 
index 15b3089dffc4575f4e08814f2a9798ea510797ae..904f570a6af2afaf453cf4c960852b14aa4f85ff 100644 (file)
@@ -58,9 +58,9 @@
   UIImage *img = [UIImage imageWithContentsOfFile:
                             [[[NSBundle mainBundle] bundlePath]
                               stringByAppendingPathComponent:
-                                @"iSaverRunner29t.png"]];
+                                @"iSaverRunner57t.png"]];
   UIButton *button = [[UIButton alloc] init];
-  [button setFrame: CGRectMake(0, 0, img.size.width, img.size.height)];
+  [button setFrame: CGRectMake(0, 0, img.size.width/2, img.size.height/2)];
   [button setBackgroundImage:img forState:UIControlStateNormal];
   [button addTarget:self
           action:@selector(titleTapped:)
@@ -89,8 +89,8 @@
 
   CGRect win = [self view].frame;
   if (win.size.width > 320) {                                  // iPad
-    [label1 setTextAlignment: UITextAlignmentLeft];
-    [label2 setTextAlignment: UITextAlignmentRight];
+    [label1 setTextAlignment: NSTextAlignmentLeft];
+    [label2 setTextAlignment: NSTextAlignmentRight];
     label2.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;
     r3.size.width = win.size.width;
     r1 = r3;
 
   } else {                                                     // iPhone
     r3.size.width = 320; // force it to be flush-left
-    [label1 setTextAlignment: UITextAlignmentLeft];
-    [label2 setTextAlignment: UITextAlignmentLeft];
+    [label1 setTextAlignment: NSTextAlignmentLeft];
+    [label2 setTextAlignment: NSTextAlignmentLeft];
     r1.origin.y = -1;    // make it fit in landscape
     r2.origin.y = r1.origin.y + r1.size.height - 2;
     r3.size.height = r1.size.height + r2.size.height;
   [v addSubview:label1];
   [v addSubview:label2];
 
+  // Default opacity looks bad.
+  [v setBackgroundColor:[[v backgroundColor] colorWithAlphaComponent:1]];
+
   self.navigationItem.titleView = v;
+
+  win.origin.x = 0;
+  win.origin.y = 0;
+  win.size.height = 44; // #### This cannot possibly be right.
+  UISearchBar *search = [[UISearchBar alloc] initWithFrame:win];
+  search.delegate = self;
+  search.placeholder = @"Search...";
+  self.tableView.tableHeaderView = search;
+
+  // Dismiss the search field's keyboard as soon as we scroll.
+# ifdef __IPHONE_7_0
+  if ([self.tableView respondsToSelector:@selector(keyboardDismissMode)])
+    [self.tableView setKeyboardDismissMode:
+           UIScrollViewKeyboardDismissModeOnDrag];
+# endif
 }
 
 
-- (id)initWithNames:(NSArray *)names descriptions:(NSDictionary *)descs;
+- (id)initWithNames:(NSArray *)_names descriptions:(NSDictionary *)_descs;
 {
   self = [self init];
   if (! self) return 0;
-  [self reload:names descriptions:descs];
+  [self reload:_names descriptions:_descs search:nil];
   [self makeTitleBar];
   return self;
 }
   int n = countof(list_by_letter);
   NSMutableArray *a = [NSMutableArray arrayWithCapacity: n];
   for (int i = 0; i < n; i++) {
+    if ([list_by_letter[i] count] == 0)  // Omit empty letter sections.
+      continue;
     char s[2];
     s[0] = (i == 'Z'-'A'+1 ? '#' : i+'A');
     s[1] = 0;
 }
 
 
-- (void) reload:(NSArray *)names descriptions:(NSDictionary *)descs
+/* Called when text is typed into the top search bar.
+ */
+- (void)searchBar:(UISearchBar *)bar textDidChange:(NSString *)txt
 {
-  if (descriptions)
-    [descriptions release];
-  descriptions = [descs retain];
+  [self reload:names descriptions:descriptions search:txt];
+}
+
+
+- (void) reload:(NSArray *)_names descriptions:(NSDictionary *)_descs
+         search:search
+{
+  if (names != _names) {
+    if (names) [names release];
+    names = [_names retain];
+  }
+  if (_descs != descriptions) {
+    if (descriptions) [descriptions release];
+    descriptions = [_descs retain];
+  }
 
   int n = countof(list_by_letter);
   for (int i = 0; i < n; i++) {
   }
 
   for (NSString *name in names) {
+
+    // If we're searching, omit any items that don't have a match in the
+    // title or description.
+    //
+    BOOL matchp = (!search || [search length] == 0);
+    if (! matchp) {
+      matchp = ([name rangeOfString:search
+                            options:NSCaseInsensitiveSearch].location
+                != NSNotFound);
+    }
+    if (! matchp) {
+      NSString *desc = [descriptions objectForKey:name];
+      matchp = ([desc rangeOfString:search
+                            options:NSCaseInsensitiveSearch].location
+                != NSNotFound);
+    }
+    if (! matchp)
+      continue;
+
     int index = ([name cStringUsingEncoding: NSASCIIStringEncoding])[0];
     if (index >= 'a' && index <= 'z')
       index -= 'a'-'A';
 - (UITableViewCell *)tableView:(UITableView *)tv
                      cellForRowAtIndexPath:(NSIndexPath *)ip
 {
-  NSString *id =
+  NSString *title = 
     [[letter_sections objectAtIndex: [ip indexAtPosition: 0]]
       objectAtIndex: [ip indexAtPosition: 1]];
-  NSString *desc = [descriptions objectForKey:id];
+  NSString *desc = [descriptions objectForKey:title];
 
-  UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier: id];
-  if (!cell) {
+  NSString *id = @"Cell";
+  UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:id];
+  if (!cell)
     cell = [[[UITableViewCell alloc]
-              initWithStyle: (desc
-                              ? UITableViewCellStyleSubtitle
-                              : UITableViewCellStyleDefault)
+                initWithStyle: UITableViewCellStyleSubtitle
               reuseIdentifier: id]
              autorelease];
-    cell.textLabel.text = id;
 
-    cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
-    if (desc)
-      cell.detailTextLabel.text = desc;
-  }
+  cell.textLabel.text = title;
+  cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
+  cell.detailTextLabel.text = desc;
+
   return cell;
 }
 
   SaverRunner *s = 
     (SaverRunner *) [[UIApplication sharedApplication] delegate];
   if (! s) return;
+
+  // Dismiss the search field's keyboard before launching a saver.
+  [self.tableView.tableHeaderView resignFirstResponder];
+
   NSAssert ([s isKindOfClass:[SaverRunner class]], @"not a SaverRunner");
   [s loadSaver: cell.textLabel.text];
 }
 }
 
 
-- (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)o
-{
-  return YES;
-}
-
-
 /* We need this to respond to "shake" gestures
  */
 - (BOOL)canBecomeFirstResponder
index c58e2b331a4437e2908008c9ce3f515f6cc17298..35d22354761c410b581fa2489d3c394598b12e28 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2006-2013 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2006-2014 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
 
 # else  // USE_IPHONE
 
-  ScreenSaverView *saverView;
-  UIView *backgroundView;
-  UINavigationController *rootViewController;
+  UINavigationController *rotating_nav;                // Hierarchy 1 (UI)
   IBOutlet UIWindow *window;
+  IBOutlet UIView *view;
+
+  UINavigationController *nonrotating_nav;     // Hierarchy 2 (savers)
+  UIWindow *saverWindow;
+  UIView *backgroundView;
+  ScreenSaverView *saverView;
+
   EAGLContext *eagl_ctx;
   GLuint gl_framebuffer, gl_renderbuffer;
-  IBOutlet UIView *view;
   UIImage *saved_screenshot;
   UIView *aboutBox;
   NSTimer *splashTimer;
index e2cd11c5808b521a57e9417583fb8d4f28ca9ba1..80031e775f6456b895cda3c6da664462e5a4317c 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2006-2013 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2006-2014 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
 #ifdef USE_IPHONE
 
 @interface RotateyViewController : UINavigationController
+{
+  BOOL allowRotation;
+}
 @end
 
 @implementation RotateyViewController
+
+/* This subclass exists so that we can ask that the SaverListController and
+   preferences panels be auto-rotated by the system.  Note that the 
+   XScreenSaverView is not auto-rotated because it is on a different UIWindow.
+ */
+
+- (id)initWithRotation:(BOOL)rotatep
+{
+  self = [super init];
+  allowRotation = rotatep;
+  return self;
+}
+
 - (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)o
 {
-  return YES;
+  return allowRotation;                                /* Deprecated in iOS 6 */
 }
+
+- (BOOL)shouldAutorotate                       /* Added in iOS 6 */
+{
+  return allowRotation;
+}
+
+- (NSUInteger)supportedInterfaceOrientations   /* Added in iOS 6 */
+{
+  return UIInterfaceOrientationMaskAll;
+}
+
 @end
 
 #endif // USE_IPHONE
@@ -354,7 +381,7 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str)
   [prefs setObject:saver forKey:@"selectedSaverName"];
   [prefs synchronize];
 
-  [rootViewController pushViewController: [saverView configureView]
+  [rotating_nav pushViewController: [saverView configureView]
                       animated:YES];
 }
 
@@ -431,15 +458,6 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str)
 
   saverName = name;
 
-  if (! backgroundView) {
-    // This view is the parent of the XScreenSaverView, and exists only
-    // so that there is a black background behind it.  Without this, when
-    // rotation is in progress, the scrolling-list window's corners show
-    // through in the corners.
-    backgroundView = [[[NSView class] alloc] initWithFrame:[window frame]];
-    [backgroundView setBackgroundColor:[NSColor blackColor]];
-  }
-
   if (saverView) {
     if ([saverView isAnimating])
       [saverView stopAnimation];
@@ -449,8 +467,27 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str)
     [saverView release];
   }
 
-  NSSize size = [window frame].size;
-  saverView = [self makeSaverView:name withSize: size];
+  /* We can't just use [window bounds] because that is the *rotated* rectangle
+     and we need the *unrotated* rectangle, so that the view is always created
+     in portrait orientation.  Without that, the initial rotation event that
+     takes us from unknown->landscape will be out of step with reality.
+   */
+  UIScreen *screen = [UIScreen mainScreen];
+# ifndef __IPHONE_8_0                          // iOS 7 SDK
+  NSSize size = [screen bounds].size;
+  int ss = [screen scale];
+# else                                         // iOS 8 SDK
+  NSSize size = ([screen respondsToSelector:@selector(nativeBounds)]
+                 ? [screen nativeBounds].size  //  iOS 8
+                 : [screen bounds].size);      //  iOS 7
+  int ss = ([screen respondsToSelector:@selector(nativeScale)]
+            ? [screen nativeScale]             //  iOS 8
+            : [screen scale]);                 //  iOS 7
+# endif                                                // iOS 8 SDK
+
+  size.width  /= ss;
+  size.height /= ss;
+  saverView = [self makeSaverView:name withSize:size];
 
   if (! saverView) {
     [[[UIAlertView alloc] initWithTitle: name
@@ -462,20 +499,41 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str)
     return;
   }
 
-  [saverView setFrame: [window frame]];
   [[NSNotificationCenter defaultCenter]
     addObserver:saverView
     selector:@selector(didRotate:)
     name:UIDeviceOrientationDidChangeNotification object:nil];
 
  LAUNCH:
+
   if (launch) {
     [self saveScreenshot];
-    [window addSubview: backgroundView];
+    NSRect f = [saverWindow bounds];
+    [backgroundView setFrame:f];
+    [saverView setFrame:f];
+    [saverWindow addSubview: backgroundView];
     [backgroundView addSubview: saverView];
-    [saverView becomeFirstResponder];
+    [saverView setBackgroundColor:[NSColor blackColor]];
+
+    /* WTF! Without creating and keying this window, we get no events
+       delivered on the saverView/saverWindow!  Bad craziness.
+     */
+    {
+      UIWindow *dummy = [[UIWindow alloc] initWithFrame:CGRectMake(0,0,0,0)];
+      [dummy setRootViewController: nonrotating_nav];  // Must be this one.
+      [dummy setHidden:NO];  // required
+      [dummy setHidden:YES];
+      [dummy release];
+    }
+
+    [saverWindow setHidden:NO];
+    [saverWindow makeKeyAndVisible];
     [saverView startAnimation];
     [self aboutPanel:nil];
+
+    // Doing this makes savers cut back to the list instead of fading,
+    // even though [XScreenSaverView stopAndClose] does setHidden:NO first.
+    // [window setHidden:YES];
   }
 # endif // USE_IPHONE
 }
@@ -521,16 +579,37 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str)
   CGFloat pt2 = 14;
   UIFont *font1 = [UIFont boldSystemFontOfSize:  pt1];
   UIFont *font2 = [UIFont italicSystemFontOfSize:pt2];
+
+# ifdef __IPHONE_7_0
+  CGSize s = CGSizeMake(frame.size.width, frame.size.height);
+  CGSize tsize1 = [[[NSAttributedString alloc]
+                     initWithString: name
+                     attributes:@{ NSFontAttributeName: font1 }]
+                    boundingRectWithSize: s
+                    options: NSStringDrawingUsesLineFragmentOrigin
+                    context: nil].size;
+  CGSize tsize2 = [[[NSAttributedString alloc]
+                     initWithString: name
+                     attributes:@{ NSFontAttributeName: font2 }]
+                    boundingRectWithSize: s
+                    options: NSStringDrawingUsesLineFragmentOrigin
+                    context: nil].size;
+# else // iOS 6 or Cocoa
   CGSize tsize1 = [name sizeWithFont:font1
                    constrainedToSize:CGSizeMake(frame.size.width,
                                                 frame.size.height)];
   CGSize tsize2 = [year sizeWithFont:font2
                    constrainedToSize:CGSizeMake(frame.size.width,
                                                 frame.size.height)];
+#endif
+
   CGSize tsize = CGSizeMake (tsize1.width > tsize2.width ?
                              tsize1.width : tsize2.width,
                              tsize1.height + tsize2.height);
 
+  tsize.width  = ceilf(tsize.width);
+  tsize.height = ceilf(tsize.height);
+
   // Don't know how to find inner margin of UITextView.
   CGFloat margin = 10;
   tsize.width  += margin * 4;
@@ -541,10 +620,7 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str)
 
   frame = CGRectMake (0, 0, tsize.width, tsize.height);
 
-  UIInterfaceOrientation orient =
-    // Why are both of these wrong when starting up rotated??
-    [[UIDevice currentDevice] orientation];
-    // [rootViewController interfaceOrientation];
+  UIInterfaceOrientation orient = [rotating_nav interfaceOrientation];
 
   /* Get the text oriented properly, and move it to the bottom of the
      screen, since many savers have action in the middle.
@@ -604,7 +680,7 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str)
       textview = [[UITextView alloc] initWithFrame:frame];
       textview.font = (j == 0 ? font1 : font2);
       textview.text = (j == 0 ? name  : year);
-      textview.textAlignment = UITextAlignmentCenter;
+      textview.textAlignment = NSTextAlignmentCenter;
       textview.showsHorizontalScrollIndicator = NO;
       textview.showsVerticalScrollIndicator   = NO;
       textview.scrollEnabled = NO;
@@ -881,14 +957,23 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str)
   }
 
   // Delete everything after the first blank line.
+  //
   r = [desc rangeOfString:@"\n\n" options:0];
   if (r.length > 0)
     desc = [desc substringToIndex: r.location];
 
-  // Truncate really long ones.
-  int max = 140;
-  if ([desc length] > max)
-    desc = [desc substringToIndex: max];
+  // Unwrap lines and compress whitespace.
+  {
+    NSString *result = @"";
+    for (NSString *s in [desc componentsSeparatedByCharactersInSet:
+                          [NSCharacterSet whitespaceAndNewlineCharacterSet]]) {
+      if ([result length] == 0)
+        result = s;
+      else if ([s length] > 0)
+        result = [NSString stringWithFormat: @"%@ %@", result, s];
+      desc = result;
+    }
+  }
 
   if (year)
     desc = [year stringByAppendingString:
@@ -1112,23 +1197,63 @@ FAIL:
 # undef ya_rand_init
   ya_rand_init (0);    // Now's a good time.
 
-  rootViewController = [[[RotateyViewController alloc] init] retain];
-  [window setRootViewController: rootViewController];
+  rotating_nav = [[[RotateyViewController alloc] initWithRotation:YES]
+                         retain];
+  [window setRootViewController: rotating_nav];
+  [window setAutoresizesSubviews:YES];
+  [window setAutoresizingMask: 
+            (UIViewAutoresizingFlexibleWidth | 
+             UIViewAutoresizingFlexibleHeight)];
+
+  nonrotating_nav = [[[RotateyViewController alloc] initWithRotation:NO]
+                          retain];
+  [nonrotating_nav setNavigationBarHidden:YES animated:NO];
+
+  /* We run the saver on a different UIWindow than the one the
+     SaverListController and preferences panels run on, because that's
+     the only way to make rotation work right.  We want the system to
+     handle rotation of the UI stuff, but we want it to keep its hands
+     off of rotation of the savers.  As of iOS 8, this seems to be the
+     only way to accomplish that.
+
+     Also, we need to create saverWindow with a portrait rectangle, always.
+     Note that [UIScreen bounds] returns rotated and scaled values.
+  */
+  UIScreen *screen = [UIScreen mainScreen];
+# ifndef __IPHONE_8_0                          // iOS 7 SDK
+  NSRect frame = [screen bounds];
+  int ss = [screen scale];
+# else                                         // iOS 8 SDK
+  NSRect frame = ([screen respondsToSelector:@selector(nativeBounds)]
+                 ? [screen nativeBounds]       //   iOS 8
+                 : [screen bounds]);           //   iOS 7
+  int ss = ([screen respondsToSelector:@selector(nativeScale)]
+            ? [screen nativeScale]             //   iOS 8
+            : [screen scale]);                 //   iOS 7
+# endif                                                // iOS 8 SDK
+  frame.size.width  /= ss;
+  frame.size.height /= ss;
+  saverWindow = [[UIWindow alloc] initWithFrame:frame];
+  [saverWindow setRootViewController: nonrotating_nav];
+  [saverWindow setHidden:YES];
+
+  /* This view is the parent of the XScreenSaverView, and exists only
+     so that there is a black background behind it.  Without this, when
+     rotation is in progress, the scrolling-list window's corners show
+     through in the corners.
+  */
+  backgroundView = [[[NSView class] alloc] initWithFrame:[saverWindow frame]];
+  [backgroundView setBackgroundColor:[NSColor blackColor]];
 
   SaverListController *menu = [[SaverListController alloc] 
                                 initWithNames:saverNames
                                 descriptions:[self makeDescTable]];
-  [rootViewController pushViewController:menu animated:YES];
+  [rotating_nav pushViewController:menu animated:YES];
   [menu becomeFirstResponder];
 
-  [window makeKeyAndVisible];
-  [window setAutoresizesSubviews:YES];
-  [window setAutoresizingMask: 
-            (UIViewAutoresizingFlexibleWidth | 
-             UIViewAutoresizingFlexibleHeight)];
-
   application.applicationSupportsShakeToEdit = YES;
 
+
 # endif // USE_IPHONE
 
   NSString *forced = 0;
@@ -1183,6 +1308,12 @@ FAIL:
 # endif
 
   [self selectedSaverDidChange:nil];
+//  [NSTimer scheduledTimerWithTimeInterval: 0
+//           target:self
+//           selector:@selector(selectedSaverDidChange:)
+//           userInfo:nil
+//           repeats:NO];
+
 
 
 # ifndef USE_IPHONE
index 083a4e401c733f3d6fdc8c8c8ccdd0dace86b008..9cd51e508f1382b489dc638c218f22ed4584dfae 100644 (file)
@@ -7,7 +7,7 @@
        <key>CFBundleExecutable</key>
        <string>${EXECUTABLE_NAME}</string>
        <key>CFBundleGetInfoString</key>
-       <string>5.30</string>
+       <string>5.31</string>
        <key>CFBundleIconFile</key>
        <string>SaverRunner</string>
        <key>CFBundleIdentifier</key>
        <key>CFBundleInfoDictionaryVersion</key>
        <string>6.0</string>
        <key>CFBundleLongVersionString</key>
-       <string>5.30</string>
+       <string>5.31</string>
        <key>CFBundleName</key>
        <string>${PRODUCT_NAME}</string>
        <key>CFBundlePackageType</key>
        <string>APPL</string>
        <key>CFBundleShortVersionString</key>
-       <string>5.30</string>
+       <string>5.31</string>
        <key>CFBundleSignature</key>
        <string>????</string>
        <key>CFBundleVersion</key>
-       <string>5.30</string>
+       <string>5.31</string>
        <key>LSMinimumSystemVersion</key>
        <string>${MACOSX_DEPLOYMENT_TARGET}</string>
        <key>NSHumanReadableCopyright</key>
-       <string>5.30</string>
+       <string>5.31</string>
        <key>NSMainNibFile</key>
        <string>SaverRunner</string>
        <key>NSPrincipalClass</key>
index b06d1725f3d9f67dfdba6c903487501377fdbb82..cc937af9fbcf5be4656098f80e85593d15359ac8 100644 (file)
@@ -7,7 +7,7 @@
        <key>CFBundleExecutable</key>
        <string>${EXECUTABLE_NAME}</string>
        <key>CFBundleGetInfoString</key>
-       <string>5.30</string>
+       <string>5.31</string>
        <key>CFBundleIconFile</key>
        <string>SaverRunner</string>
        <key>CFBundleIdentifier</key>
@@ -15,7 +15,7 @@
        <key>CFBundleInfoDictionaryVersion</key>
        <string>6.0</string>
        <key>CFBundleLongVersionString</key>
-       <string>5.30</string>
+       <string>5.31</string>
        <key>CFBundleName</key>
        <string>${PRODUCT_NAME}</string>
        <key>CFBundleDisplayName</key>
        <key>CFBundlePackageType</key>
        <string>APPL</string>
        <key>CFBundleShortVersionString</key>
-       <string>5.30</string>
+       <string>5.31</string>
        <key>CFBundleSignature</key>
        <string>????</string>
        <key>CFBundleVersion</key>
-       <string>5.30</string>
+       <string>5.31</string>
        <key>LSMinimumSystemVersion</key>
        <string>${MACOSX_DEPLOYMENT_TARGET}</string>
        <key>LSUIElement</key>
        <true/>
        <key>NSHumanReadableCopyright</key>
-       <string>5.30</string>
+       <string>5.31</string>
        <key>NSMainNibFile</key>
        <string>Updater</string>
        <key>NSPrincipalClass</key>
index 77009ea114ec8eda795a251ff57805e465f07434..93d7dca4d8c8bead5ea8bd96c7f2a132bb3103bf 100644 (file)
        <key>CFBundlePackageType</key>
        <string>BNDL</string>
        <key>CFBundleShortVersionString</key>
-       <string>5.30</string>
+       <string>5.31</string>
        <key>CFBundleSignature</key>
        <string>????</string>
        <key>CFBundleVersion</key>
-       <string>5.30</string>
+       <string>5.31</string>
        <key>LSMinimumSystemVersion</key>
        <string>10.4</string>
        <key>NSMainNibFile</key>
index 1e58dc26666a6aafcd20acd6d1a4f31853cdf7c3..6dceacf7010a921894f7509ccccbebc649880eaa 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2006-2013 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2006-2014 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -228,10 +228,13 @@ typedef enum { SimpleXMLCommentKind,
   webView = [[UIWebView alloc] init];
   webView.delegate = self;
   webView.dataDetectorTypes = UIDataDetectorTypeNone;
-  self.   autoresizingMask = (UIViewAutoresizingFlexibleWidth |
-                              UIViewAutoresizingFlexibleHeight);
-  webView.autoresizingMask = (UIViewAutoresizingFlexibleWidth |
-                              UIViewAutoresizingFlexibleHeight);
+  self.   autoresizingMask = UIViewAutoresizingNone;  // we do it manually
+  webView.autoresizingMask = UIViewAutoresizingNone;
+  webView.scrollView.scrollEnabled = NO; 
+  webView.scrollView.bounces = NO;
+  webView.opaque = NO;
+  [webView setBackgroundColor:[UIColor clearColor]];
+
   [self addSubview: webView];
   [self setHTML: h];
   return self;
@@ -270,6 +273,7 @@ typedef enum { SimpleXMLCommentKind,
                       " font-family: \"%@\";"
                       " font-size: %.4fpx;"    // Must be "px", not "pt"!
                       " line-height: %.4fpx;"   // And no spaces before it.
+                      " -webkit-text-size-adjust: none;"
                       "}"
                     "\n//-->\n"
                    "</STYLE>"
@@ -282,6 +286,7 @@ typedef enum { SimpleXMLCommentKind,
               [font pointSize],
               [font lineHeight],
               h];
+  [webView stopLoading];
   [webView loadHTMLString:h2 baseURL:[NSURL URLWithString:@""]];
 }
 
@@ -290,6 +295,8 @@ static char *anchorize (const char *url);
 
 - (void) setText: (NSString *)t
 {
+  t = [t stringByTrimmingCharactersInSet:[NSCharacterSet
+                                           whitespaceCharacterSet]];
   t = [t stringByReplacingOccurrencesOfString:@"&" withString:@"&amp;"];
   t = [t stringByReplacingOccurrencesOfString:@"<" withString:@"&lt;"];
   t = [t stringByReplacingOccurrencesOfString:@">" withString:@"&gt;"];
@@ -313,6 +320,12 @@ static char *anchorize (const char *url);
     }
     h = [NSString stringWithFormat: @"%@ %@", h, s];
   }
+
+  h = [h stringByReplacingOccurrencesOfString:@" <P> " withString:@"<P>"];
+  h = [h stringByReplacingOccurrencesOfString:@"<BR><P>" withString:@"<P>"];
+  h = [h stringByTrimmingCharactersInSet:[NSCharacterSet
+                                           whitespaceAndNewlineCharacterSet]];
+
   [self setHTML: h];
 }
 
@@ -336,8 +349,6 @@ static char *anchorize (const char *url);
   r.origin.x = 0;
   r.origin.y = 0;
   [webView setFrame: r];
-  [self setHTML: html];
-  [webView reload];
 }
 
 
@@ -345,6 +356,7 @@ static char *anchorize (const char *url);
 {
   NSString *result = @"";
 
+  // Add newlines.
   str = [str stringByReplacingOccurrencesOfString:@"<P>"
              withString:@"<BR><BR>"
              options:NSCaseInsensitiveSearch
@@ -354,12 +366,25 @@ static char *anchorize (const char *url);
              options:NSCaseInsensitiveSearch
              range:NSMakeRange(0, [str length])];
 
+  // Remove HREFs.
   for (NSString *s in [str componentsSeparatedByString: @"<"]) {
     NSRange r = [s rangeOfString:@">"];
     if (r.length > 0)
       s = [s substringFromIndex: r.location + r.length];
     result = [result stringByAppendingString: s];
   }
+
+  // Compress internal horizontal whitespace.
+  str = result;
+  result = @"";
+  for (NSString *s in [str componentsSeparatedByCharactersInSet:
+                             [NSCharacterSet whitespaceCharacterSet]]) {
+    if ([result length] == 0)
+      result = s;
+    else if ([s length] > 0)
+      result = [NSString stringWithFormat: @"%@ %@", result, s];
+  }
+
   return result;
 }
 
@@ -370,8 +395,15 @@ static char *anchorize (const char *url);
 
   /* It would be sensible to just ask the UIWebView how tall the page is,
      instead of hoping that NSString and UIWebView measure fonts and do
-     wrapping in exactly the same way, but I can't make that work.
-     Maybe because it loads async?
+     wrapping in exactly the same way, but since UIWebView is asynchronous,
+     we'd have to wait for the document to load first, e.g.:
+
+       - Start the document loading;
+       - return a default height to use for the UITableViewCell;
+       - wait for the webViewDidFinishLoad delegate method to fire;
+       - then force the UITableView to reload, to pick up the new height.
+
+     But I couldn't make that work.
    */
 # if 0
   r.size.height = [[webView
@@ -385,11 +417,6 @@ static char *anchorize (const char *url);
   s = [text sizeWithFont: font
             constrainedToSize: s
             lineBreakMode:NSLineBreakByWordWrapping];
-
-  // GAAAH. Add one more line, or the UIWebView is still scrollable!
-  // The text is sized right, but it lets you scroll it up anyway.
-  s.height += [font pointSize];
-
   r.size.height = s.height;
 # endif
 
@@ -1329,6 +1356,8 @@ hreffify (NSText *nstext)
       [self placeChild:lab on:parent];
 # else  // USE_IPHONE
       [lab setTextAlignment: NSTextAlignmentRight];
+      // Sometimes rotation screws up truncation.
+      [lab setLineBreakMode:NSLineBreakByClipping];
       [self placeChild:lab on:parent right:(label ? YES : NO)];
 # endif // USE_IPHONE
 
@@ -1363,6 +1392,10 @@ hreffify (NSText *nstext)
       // Make right label be same height as slider.
       rect.size.height = [slider frame].size.height;
       [lab setFrame:rect];
+# ifdef USE_IPHONE
+      // Sometimes rotation screws up truncation.
+      [lab setLineBreakMode:NSLineBreakByClipping];
+# endif
       [self placeChild:lab on:parent right:YES];
       [lab release];
      }
@@ -1677,7 +1710,7 @@ set_menu_item_object (NSMenuItem *item, NSObject *obj)
   // Store the items for this picker in the picker_values array.
   // This is so fucking stupid.
 
-  int menu_number = [pref_keys count] - 1;
+  unsigned long menu_number = [pref_keys count] - 1;
   if (! picker_values)
     picker_values = [[NSMutableArray arrayWithCapacity:menu_number] retain];
   while ([picker_values count] <= menu_number)
@@ -2488,7 +2521,25 @@ last_child (NSView *parent)
 
 # else // USE_IPHONE
 
-  // Controls is an array of arrays of the controls, divided into sections.
+  /* Controls is an array of arrays of the controls, divided into sections.
+     Each hgroup / vgroup gets a nested array, too, e.g.:
+
+       [ [ [ <label>, <checkbox> ],
+           [ <label>, <checkbox> ],
+           [ <label>, <checkbox> ] ],
+         [ <label>, <text-field> ],
+         [ <label>, <low-label>, <slider>, <high-label> ],
+         [ <low-label>, <slider>, <high-label> ],
+         <HTML-label>
+       ];
+
+     If an element begins with a label, it is terminal, otherwise it is a
+     group.  There are (currently) never more than 4 elements in a single
+     terminal element.
+
+     A blank vertical spacer is placed between each hgroup / vgroup,
+     by making each of those a new section in the TableView.
+   */
   if (! controls)
     controls = [[NSMutableArray arrayWithCapacity:10] retain];
   if ([controls count] == 0)
@@ -2506,7 +2557,7 @@ last_child (NSView *parent)
       NSAssert ([(NSArray *) old count] < 4, @"internal error");
       [(NSMutableArray *) old addObject: child];
     } else {
-      // Replace the control in this cell with an array, then app
+      // Replace the control in this cell with an array, then append
       NSMutableArray *a = [NSMutableArray arrayWithObjects: old, child, nil];
       [current replaceObjectAtIndex:[current count]-1 withObject:a];
     }
@@ -2649,6 +2700,9 @@ layout_group (NSView *group, BOOL horiz_p)
   } else if ([name isEqualToString:@"command"]) {
     // do nothing: this is the "-root" business
 
+  } else if ([name isEqualToString:@"video"]) {
+    // ignored
+
   } else if ([name isEqualToString:@"boolean"]) {
     [self makeCheckbox:node on:parent];
 
@@ -3170,7 +3224,7 @@ wrap_with_buttons (NSWindow *window, NSView *panel)
 - (CGFloat)tableView:(UITableView *)tv
            heightForRowAtIndexPath:(NSIndexPath *)ip
 {
-  CGFloat h = [tv rowHeight];
+  CGFloat h = 0;
 
   NSView *ctl = [[controls objectAtIndex:[ip indexAtPosition:0]]
                   objectAtIndex:[ip indexAtPosition:1]];
@@ -3178,27 +3232,19 @@ wrap_with_buttons (NSWindow *window, NSView *panel)
   if ([ctl isKindOfClass:[NSArray class]]) {
     NSArray *set = (NSArray *) ctl;
     switch ([set count]) {
-    case 4:
-# ifdef LABEL_ABOVE_SLIDER
-      h *= 1.7; break; // label + left/slider/right: 2 1/2 lines
-# endif
-    case 3: h *= 1.2; break;   // left/slider/right: 1 1/2 lines
-    case 2:
-      if ([[set objectAtIndex:1] isKindOfClass:[UITextField class]])
-        h *= 1.2;
+    case 4:                    // label + left/slider/right.
+    case 3:                    // left/slider/right.
+      h = FONT_SIZE * 3.0;
+      break;
+    case 2:                    // Checkboxes, or text fields.
+      h = FONT_SIZE * 2.4;
       break;
     }
   } else if ([ctl isKindOfClass:[UILabel class]]) {
-    UILabel *t = (UILabel *) ctl;
-    CGRect r = t.frame;
-    r.size.width = 250;                // WTF! Black magic!
-    r.size.width -= LEFT_MARGIN;
-    [t setFrame:r];
-    [t sizeToFit];
-    r = t.frame;
-    h = r.size.height + LINE_SPACING * 3;
-# ifdef USE_HTML_LABELS
+    // Radio buttons in a multi-select list.
+    h = FONT_SIZE * 1.9;
 
+# ifdef USE_HTML_LABELS
   } else if ([ctl isKindOfClass:[HTMLLabel class]]) {
     
     HTMLLabel *t = (HTMLLabel *) ctl;
@@ -3208,15 +3254,14 @@ wrap_with_buttons (NSWindow *window, NSView *panel)
     [t setFrame:r];
     [t sizeToFit];
     r = t.frame;
-    h = r.size.height + LINE_SPACING * 3;
-
+    h = r.size.height;
 # endif // USE_HTML_LABELS
-  } else {
-    CGFloat h2 = [ctl frame].size.height;
-    h2 += LINE_SPACING * 2;
-    if (h2 > h) h = h2;
+
+  } else {                     // Does this ever happen?
+    h = FONT_SIZE + LINE_SPACING * 2;
   }
 
+  if (h <= 0) abort();
   return h;
 }
 
@@ -3239,6 +3284,11 @@ wrap_with_buttons (NSWindow *window, NSView *panel)
   [tv beginUpdates];
   [tv reloadRowsAtIndexPaths:a withRowAnimation:UITableViewRowAnimationNone];
   [tv endUpdates];
+
+  // Default opacity looks bad.
+  // #### Oh great, this only works *sometimes*.
+  UIView *v = [[self navigationItem] titleView];
+  [v setBackgroundColor:[[v backgroundColor] colorWithAlphaComponent:1]];
 }
 
 
@@ -3304,46 +3354,18 @@ wrap_with_buttons (NSWindow *window, NSView *panel)
 - (UITableViewCell *)tableView:(UITableView *)tv
                      cellForRowAtIndexPath:(NSIndexPath *)ip
 {
-#if 0
-  /* #### If we re-use cells, then clicking on a checkbox RadioButton
-          (in non-USE_PICKER_VIEW mode) makes all the cells disappear.
-          This doesn't happen if we don't re-use any cells. Oh well.
-   */
-  NSString *id = [NSString stringWithFormat: @"%d:%d",
-                           [ip indexAtPosition:0],
-                           [ip indexAtPosition:1]];
-  UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier: id];
-
-  if (cell) return cell;
-#else
-  NSString *id = nil;
-  UITableViewCell *cell;
-#endif
-
-  cell = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault
-                                   reuseIdentifier: id]
-           autorelease];
-  cell.selectionStyle = UITableViewCellSelectionStyleNone;
-
-  CGRect p = [cell frame];
-  CGRect r;
-
-  p.size.height = [self tableView:tv heightForRowAtIndexPath:ip];
-  [cell setFrame:p];
-
-  // Allocate more space to the controls on iPad screens,
-  // and on landscape-mode iPhones.
   CGFloat ww = [tv frame].size.width;
-  CGFloat left_edge = (ww > 700
-                       ? p.size.width * 0.9
-                       : ww > 320
-                       ? p.size.width * 0.5
-                       : p.size.width * 0.3);
-  CGFloat right_edge = p.origin.x + p.size.width - LEFT_MARGIN;
+  CGFloat hh = [self tableView:tv heightForRowAtIndexPath:ip];
+
+  // Width of the column of labels on the left.
+  CGFloat left_width = ww * 0.4;
+  CGFloat right_edge = ww - LEFT_MARGIN;
 
+  CGFloat max = FONT_SIZE * 12;
+  if (left_width > max) left_width = max;
 
   NSView *ctl = [[controls objectAtIndex:[ip indexAtPosition:0]]
-                  objectAtIndex:[ip indexAtPosition:1]];
+                           objectAtIndex:[ip indexAtPosition:1]];
 
   if ([ctl isKindOfClass:[NSArray class]]) {
     // This cell has a set of objects in it.
@@ -3356,35 +3378,35 @@ wrap_with_buttons (NSWindow *window, NSView *panel)
         NSAssert ([label isKindOfClass:[UILabel class]], @"unhandled type");
         ctl = [set objectAtIndex: 1];
 
-        r = [ctl frame];
-        if ([ctl isKindOfClass:[UISwitch class]]) {
-          // Flush right checkboxes.
-          ctl.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;
+        CGRect r = [ctl frame];
+
+        if ([ctl isKindOfClass:[UISwitch class]]) {    // Checkboxes.
           r.size.width = 80;  // Magic.
-          r.origin.x = right_edge - r.size.width;
+          r.origin.x = right_edge - r.size.width + 30;  // beats me
         } else {
-          // Expandable sliders.
-          ctl.autoresizingMask = UIViewAutoresizingFlexibleWidth;
-          r.origin.x = left_edge;
+          r.origin.x = left_width;                     // Text fields, etc.
           r.size.width = right_edge - r.origin.x;
         }
-        r.origin.y = (p.size.height - r.size.height) / 2;
+
+        r.origin.y = (hh - r.size.height) / 2;   // Center vertically.
         [ctl setFrame:r];
 
-        // Make a box.
-        NSView *box = [[UIView alloc] initWithFrame:p];
+        // Make a box and put the label and checkbox/slider into it.
+        r.origin.x = 0;
+        r.origin.y = 0;
+        r.size.width  = ww;
+        r.size.height = hh;
+        NSView *box = [[UIView alloc] initWithFrame:r];
         [box addSubview: ctl];
 
-        // cell.textLabel.text = [(UILabel *) ctl text];
+        // Let the label make use of any space not taken up by the control.
         r = [label frame];
         r.origin.x = LEFT_MARGIN;
         r.origin.y = 0;
         r.size.width  = [ctl frame].origin.x - r.origin.x;
-        r.size.height = p.size.height;
+        r.size.height = hh;
         [label setFrame:r];
         [label setFont:[NSFont boldSystemFontOfSize: FONT_SIZE]];
-        label.autoresizingMask = UIViewAutoresizingFlexibleRightMargin;
-        box.  autoresizingMask = UIViewAutoresizingFlexibleWidth;
         [box addSubview: label];
 
         ctl = box;
@@ -3393,8 +3415,8 @@ wrap_with_buttons (NSWindow *window, NSView *panel)
     case 3:
     case 4:
       {
-        // With 3 elements, the first and last must be labels.
-        // With 4 elements, the first, second and last must be labels.
+        // With 3 elements, 1 and 3 are labels.
+        // With 4 elements, 1, 2 and 4 are labels.
         int i = 0;
         UILabel *top  = ([set count] == 4
                          ? [set objectAtIndex: i++]
@@ -3409,108 +3431,106 @@ wrap_with_buttons (NSWindow *window, NSView *panel)
 
         // 3 elements: control at top of cell.
         // 4 elements: center the control vertically.
-        r = [mid frame];
+        CGRect r = [mid frame];
+        r.size.height = 32;   // Unchangable height of the slider thumb.
+
+        // Center the slider between left_width and right_edge.
 # ifdef  LABEL_ABOVE_SLIDER
-        left_edge = LEFT_MARGIN;
+        r.origin.x = LEFT_MARGIN;
+# else
+        r.origin.x = left_width;
 # endif
-        r.origin.x = left_edge;
+        r.origin.y = (hh - r.size.height) / 2;
         r.size.width = right_edge - r.origin.x;
-        r.origin.y = ([set count] == 3
-                      ? 8
-                      : (p.size.height - r.size.height) / 2);
         [mid setFrame:r];
 
-        // Top label goes above, flush center/top.
         if (top) {
           r.size = [[top text] sizeWithFont:[top font]
                                constrainedToSize:
-                                 CGSizeMake (p.size.width - LEFT_MARGIN*2,
-                                             100000)
+                                 CGSizeMake (ww - LEFT_MARGIN*2, 100000)
                                lineBreakMode:[top lineBreakMode]];
-          r.origin.x = (p.size.width - r.size.width) / 2;
+# ifdef LABEL_ABOVE_SLIDER
+          // Top label goes above, flush center/top.
+          r.origin.x = (ww - r.size.width) / 2;
           r.origin.y = 4;
+# else  // !LABEL_ABOVE_SLIDER
+          // Label goes on the left.
+          r.origin.x = LEFT_MARGIN;
+          r.origin.y = 0;
+          r.size.width  = left_width - LEFT_MARGIN;
+          r.size.height = hh;
+# endif // !LABEL_ABOVE_SLIDER
           [top setFrame:r];
         }
 
         // Left label goes under control, flush left/bottom.
         r.size = [[left text] sizeWithFont:[left font]
-                               constrainedToSize:
-                                 CGSizeMake(p.size.width - LEFT_MARGIN*2,
-                                            100000)
+                              constrainedToSize:
+                                CGSizeMake(ww - LEFT_MARGIN*2, 100000)
                               lineBreakMode:[left lineBreakMode]];
         r.origin.x = [mid frame].origin.x;
-        r.origin.y = p.size.height - r.size.height - 4;
+        r.origin.y = hh - r.size.height - 4;
         [left setFrame:r];
 
         // Right label goes under control, flush right/bottom.
         r = [right frame];
         r.size = [[right text] sizeWithFont:[right font]
                                constrainedToSize:
-                                 CGSizeMake(p.size.width - LEFT_MARGIN*2,
-                                            1000000)
+                                 CGSizeMake(ww - LEFT_MARGIN*2, 1000000)
                                lineBreakMode:[right lineBreakMode]];
         r.origin.x = ([mid frame].origin.x + [mid frame].size.width -
                       r.size.width);
         r.origin.y = [left frame].origin.y;
         [right setFrame:r];
 
-        // Then make a box.
-        ctl = [[UIView alloc] initWithFrame:p];
-        if (top) {
-# ifdef LABEL_ABOVE_SLIDER
-          [ctl addSubview: top];
-          top.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin|
-                                  UIViewAutoresizingFlexibleRightMargin);
-# else
-          r = [top frame];
-          r.origin.x = LEFT_MARGIN;
-          r.origin.y = 0;
-          r.size.width  = [mid frame].origin.x - r.origin.x;
-          r.size.height = p.size.height;
-          [top setFrame:r];
-          top.autoresizingMask = UIViewAutoresizingFlexibleRightMargin;
-          [ctl addSubview: top];
-# endif
-        }
-        [ctl addSubview: left];
-        [ctl addSubview: mid];
-        [ctl addSubview: right];
-
-        left. autoresizingMask = UIViewAutoresizingFlexibleRightMargin;
-        mid.  autoresizingMask = UIViewAutoresizingFlexibleWidth;
-        right.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;
-        ctl.  autoresizingMask = UIViewAutoresizingFlexibleWidth;
+        // Make a box and put the labels and slider into it.
+        r.origin.x = 0;
+        r.origin.y = 0;
+        r.size.width  = ww;
+        r.size.height = hh;
+        NSView *box = [[UIView alloc] initWithFrame:r];
+        if (top)
+          [box addSubview: top];
+        [box addSubview: left];
+        [box addSubview: right];
+        [box addSubview: mid];
+
+        ctl = box;
       }
       break;
     default:
       NSAssert (0, @"unhandled size");
     }
-  } else {
-    // A single view, not a pair.
-
-    r = [ctl frame];
+  } else {     // A single view, not a pair.
+    CGRect r = [ctl frame];
     r.origin.x = LEFT_MARGIN;
-    r.origin.y = LINE_SPACING;
+    r.origin.y = 0;
     r.size.width = right_edge - r.origin.x;
+    r.size.height = hh;
     [ctl setFrame:r];
-
-    ctl.autoresizingMask = UIViewAutoresizingFlexibleWidth;
-
-# ifndef USE_PICKER_VIEW
-    if ([ctl isKindOfClass:[RadioButton class]])
-      [self updateRadioGroupCell:cell button:(RadioButton *)ctl];
-# endif // USE_PICKER_VIEW
   }
 
-  if ([ctl isKindOfClass:[UILabel class]]) {
-    // Make label full height to allow text to line-wrap if necessary.
-    r = [ctl frame];
-    r.origin.y = p.origin.y;
-    r.size.height = p.size.height;
-    [ctl setFrame:r];
-  }
+  NSString *id = @"Cell";
+  UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:id];
+  if (!cell)
+    cell = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault
+                                     reuseIdentifier: id]
+             autorelease];
 
+  for (UIView *subview in [cell.contentView subviews])
+    [subview removeFromSuperview];
   [cell.contentView addSubview: ctl];
+  CGRect r = [ctl frame];
+  r.origin.x = 0;
+  r.origin.y = 0;
+  [cell setFrame:r];
+  cell.selectionStyle = UITableViewCellSelectionStyleNone;
+  [cell setAccessoryType:UITableViewCellAccessoryNone];
+
+# ifndef USE_PICKER_VIEW
+  if ([ctl isKindOfClass:[RadioButton class]])
+    [self updateRadioGroupCell:cell button:(RadioButton *)ctl];
+# endif // USE_PICKER_VIEW
 
   return cell;
 }
index b08313efcdd7ebb12279f14a0074dcfcf724905d..7af44038bc7c900eacd57a184f1b7657240c0939 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2006-2013 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2006-2014 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -223,26 +223,15 @@ extern void check_gl_error (const char *type);
    and discarded.  That's ok, though, because mostly it's just calls to
    XClearWindow and housekeeping stuff like that.  So we make a tiny one.
  */
-- (void) createBackbuffer
+- (void) createBackbuffer:(CGSize)new_size
 {
-  // Don't resize the X11 window to match rotation. 
-  // Rotation and scaling are handled in GL.
-  //
-# ifdef USE_IPHONE
-  double s = [self hackedContentScaleFactor];
-# else
-  double s = 1;
-# endif
-  // Store a realistic size in backbuffer_size, though the buffer is minimal.
-  NSRect f = [self bounds];
-  backbuffer_size.width  = (int) (s * f.size.width);
-  backbuffer_size.height = (int) (s * f.size.height);
+  backbuffer_size = new_size;
 
   if (! backbuffer) {
     CGColorSpaceRef cs = CGColorSpaceCreateDeviceRGB();
     int w = 8;
     int h = 8;
-    backbuffer = CGBitmapContextCreate (NULL, w, h,
+    backbuffer = CGBitmapContextCreate (NULL, w, h,   // yup, only 8px x 8px.
                                         8, w*4, cs,
                                         kCGImageAlphaPremultipliedLast);
     CGColorSpaceRelease (cs);
@@ -251,6 +240,16 @@ extern void check_gl_error (const char *type);
 # endif // USE_BACKBUFFER
 
 
+/* When changing the device orientation, leave the X11 Window and glViewport
+   in portrait configuration.  OpenGL hacks examine current_device_rotation()
+   within the scene as needed.
+ */
+- (BOOL)reshapeRotatedWindow
+{
+  return NO;
+}
+
+
 - (void)dealloc {
   // ogl_ctx
   // gl_framebuffer
@@ -419,6 +418,17 @@ init_GL (ModeInfo *mi)
   
 # endif // USE_IPHONE
 
+  // I don't know why this is necessary, but it beats randomly having some
+  // textures be upside down.
+  //
+  glMatrixMode(GL_TEXTURE);
+  glLoadIdentity();
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+
+
   // Caller expects a pointer to an opaque struct...  which it dereferences.
   // Don't ask me, it's historical...
   static int blort = -1;
index b54685079a2ac9ca36ceb221da324da9e6a38867..28d1f51fab258d6647b17dfd5d63db6a801736d2 100644 (file)
   UIDeviceOrientation orientation, new_orientation;
   BOOL screenLocked;
 
-  CGSize initial_bounds;
+  CGSize initial_bounds;       // portrait-mode geometry
        
   GLfloat rotation_ratio;      // ratio thru rotation anim, or -1
   NSSize rot_from, rot_to;     // start size rect, end size rect
   GLfloat angle_from, angle_to;        // start angle, end angle
   double rot_start_time;
-  BOOL ignore_rotation_p;
+  BOOL ignore_rotation_p;      // hack requests "always portrait".
+                               // some want this, some do not.
 
-  NSSize rot_current_size;
-  GLfloat rot_current_angle;
+  NSSize rot_current_size;     // current intermediate or final orientation.
+  GLfloat rot_current_angle;   // only right angles when rotation complete.
 
   NSTimer *crash_timer;
 
 
 #ifdef USE_IPHONE
 - (void)didRotate:(NSNotification *)notification;
+- (BOOL)reshapeRotatedWindow;
 - (void)setScreenLocked:(BOOL)locked;
 #endif // USE_IPHONE
 
 #ifdef USE_BACKBUFFER
 - (void)initLayer;
-- (void)createBackbuffer;
+- (void)createBackbuffer:(CGSize)s;
 #endif // USE_BACKBUFFER
 
 @end
index 972ffb24806c83248196ad02f55571bc797d4cd1..3f0cd8f0fc6239e6958b3661d8635d64e5a6a87d 100644 (file)
@@ -47,6 +47,8 @@ int mono_p = 0;
 
 # ifdef USE_IPHONE
 
+#  define NSSizeToCGSize(x) (x)
+
 extern NSDictionary *make_function_table_dict(void);  // ios-function-table.m
 
 /* Stub definition of the superclass, for iPhone.
@@ -268,6 +270,7 @@ add_default_options (const XrmOptionDescRec *opts,
 # endif
     ".imageDirectory:     ~/Pictures",
     ".relaunchDelay:      2",
+    ".texFontCacheSize:   30",
 
 # ifndef USE_IPHONE
 #  define STR1(S) #S
@@ -354,6 +357,23 @@ double_time (void)
 }
 #endif // USE_IPHONE
 
+#if TARGET_IPHONE_SIMULATOR
+static const char *
+orientname(unsigned long o)
+{
+  switch (o) {
+  case UIDeviceOrientationUnknown:             return "Unknown";
+  case UIDeviceOrientationPortrait:            return "Portrait";
+  case UIDeviceOrientationPortraitUpsideDown:  return "PortraitUpsideDown";
+  case UIDeviceOrientationLandscapeLeft:       return "LandscapeLeft";
+  case UIDeviceOrientationLandscapeRight:      return "LandscapeRight";
+  case UIDeviceOrientationFaceUp:              return "FaceUp";
+  case UIDeviceOrientationFaceDown:            return "FaceDown";
+  default:                                     return "ERROR";
+  }
+}
+#endif // TARGET_IPHONE_SIMULATOR
+
 
 - (id) initWithFrame:(NSRect)frame
            saverName:(NSString *)saverName
@@ -413,7 +433,7 @@ double_time (void)
   next_frame_time = 0;
   
 # ifdef USE_BACKBUFFER
-  [self createBackbuffer];
+  [self createBackbuffer:NSSizeToCGSize(frame.size)];
   [self initLayer];
 # endif
 
@@ -675,12 +695,18 @@ double current_device_rotation (void)
     double duration = 1/6.0;
     rotation_ratio = 1 - ((rot_start_time + duration - now) / duration);
 
-    if (rotation_ratio > 1) {  // Done animating.
+    if (rotation_ratio > 1 || ignore_rotation_p) {     // Done animating.
       orientation = new_orientation;
       rot_current_angle = angle_to;
       rot_current_size = rot_to;
       rotation_ratio = -1;
 
+# if TARGET_IPHONE_SIMULATOR
+      NSLog (@"rotation ended: %s %d, %d x %d",
+             orientname(orientation), (int) rot_current_angle,
+             (int) rot_current_size.width, (int) rot_current_size.height);
+# endif
+
       // Check orientation again in case we rotated again while rotating:
       // this is a no-op if nothing has changed.
       [self didRotate:nil];
@@ -696,10 +722,11 @@ double current_device_rotation (void)
 #   undef CLAMP180
 
   double s = [self hackedContentScaleFactor];
-  if (!ignore_rotation_p &&
-      /* rotation_ratio && */
-      ((int) backbuffer_size.width  != (int) (s * rot_current_size.width) ||
-       (int) backbuffer_size.height != (int) (s * rot_current_size.height)))
+  CGSize rotsize = ((ignore_rotation_p || ![self reshapeRotatedWindow])
+                    ? initial_bounds
+                    : rot_current_size);
+  if ((int) backbuffer_size.width  != (int) (s * rotsize.width) ||
+      (int) backbuffer_size.height != (int) (s * rotsize.height))
     [self resize_x11];
 }
 
@@ -738,18 +765,8 @@ double current_device_rotation (void)
 /* Create a bitmap context into which we render everything.
    If the desired size has changed, re-created it.
  */
-- (void) createBackbuffer
+- (void) createBackbuffer:(CGSize)new_size
 {
-# ifdef USE_IPHONE
-  double s = [self hackedContentScaleFactor];
-  CGSize rotsize = ignore_rotation_p ? initial_bounds : rot_current_size;
-  int new_w = s * rotsize.width;
-  int new_h = s * rotsize.height;
-# else
-  int new_w = [self bounds].size.width;
-  int new_h = [self bounds].size.height;
-# endif
-       
   // Colorspaces and CGContexts only happen with non-GL hacks.
   if (colorspace)
     CGColorSpaceRelease (colorspace);
@@ -819,21 +836,25 @@ double current_device_rotation (void)
   }
 
   if (backbuffer &&
-      backbuffer_size.width  == new_w &&
-      backbuffer_size.height == new_h)
+      (int)backbuffer_size.width  == (int)new_size.width &&
+      (int)backbuffer_size.height == (int)new_size.height)
     return;
 
   CGSize osize = backbuffer_size;
   CGContextRef ob = backbuffer;
 
-  backbuffer_size.width  = new_w;
-  backbuffer_size.height = new_h;
+  backbuffer_size = new_size;
+
+# if TARGET_IPHONE_SIMULATOR
+  NSLog(@"backbuffer %.0f %.0f",
+        backbuffer_size.width, backbuffer_size.height);
+# endif
 
   backbuffer = CGBitmapContextCreate (NULL,
-                                      backbuffer_size.width,
-                                      backbuffer_size.height,
+                                      (int)backbuffer_size.width,
+                                      (int)backbuffer_size.height,
                                       8, 
-                                      backbuffer_size.width * 4,
+                                      (int)backbuffer_size.width * 4,
                                       colorspace,
                                       // kCGImageAlphaPremultipliedLast
                                       (kCGImageAlphaNoneSkipFirst |
@@ -870,21 +891,32 @@ double current_device_rotation (void)
 {
   if (!xwindow) return;  // early
 
+  CGSize new_size;
 # ifdef USE_BACKBUFFER
-  [self createBackbuffer];
-  jwxyz_window_resized (xdpy, xwindow,
-                        0, 0,
-                        backbuffer_size.width, backbuffer_size.height,
+#  ifdef USE_IPHONE
+  double s = [self hackedContentScaleFactor];
+  CGSize rotsize = ((ignore_rotation_p || ![self reshapeRotatedWindow])
+                    ? initial_bounds
+                    : rot_current_size);
+  new_size.width  = s * rotsize.width;
+  new_size.height = s * rotsize.height;
+#  else
+  new_size = NSSizeToCGSize([self bounds].size);
+#  endif
+
+  [self createBackbuffer:new_size];
+  jwxyz_window_resized (xdpy, xwindow, 0, 0, new_size.width, new_size.height,
                         backbuffer);
 # else   // !USE_BACKBUFFER
-  NSRect r = [self frame];             // ignoring rotation is closer
-  r.size = [self bounds].size;         // to what XGetGeometry expects.
-  jwxyz_window_resized (xdpy, xwindow,
-                        r.origin.x, r.origin.y,
-                        r.size.width, r.size.height,
+  new_size = [self bounds].size;
+  jwxyz_window_resized (xdpy, xwindow, 0, 0, new_size.width, new_size.height,
                         0);
 # endif  // !USE_BACKBUFFER
 
+# if TARGET_IPHONE_SIMULATOR
+  NSLog(@"reshape %.0f x %.0f", new_size.width, new_size.height);
+# endif
+
   // Next time render_x11 is called, run the saver's reshape_cb.
   resized_p = YES;
 }
@@ -1179,6 +1211,7 @@ double current_device_rotation (void)
   CGRect bounds;
   bounds.origin.x = 0;
   bounds.origin.y = 0;
+
   bounds.size.width = backbuffer_size.width / s;
   bounds.size.height = backbuffer_size.height / s;
   self.layer.bounds = bounds;
@@ -1626,50 +1659,96 @@ double current_device_rotation (void)
      suppose that this abstraction-breakage means that I'm adding
      XScreenSaverView to the UINavigationController wrong...
    */
-  UIViewController *v = [[self window] rootViewController];
-  if ([v isKindOfClass: [UINavigationController class]]) {
-    UINavigationController *n = (UINavigationController *) v;
-    [[n topViewController] becomeFirstResponder];
+//  UIViewController *v = [[self window] rootViewController];
+//  if ([v isKindOfClass: [UINavigationController class]]) {
+//    UINavigationController *n = (UINavigationController *) v;
+//    [[n topViewController] becomeFirstResponder];
+//  }
+  [self resignFirstResponder];
+
+  // Find SaverRunner.window (as opposed to SaverRunner.saverWindow)
+  UIWindow *listWindow = 0;
+  for (UIWindow *w in [[UIApplication sharedApplication] windows]) {
+    if (w != [self window]) {
+      listWindow = w;
+      break;
+    }
   }
 
   UIView *fader = [self superview];  // the "backgroundView" view is our parent
 
   if (relaunch_p) {   // Fake a shake on the SaverListController.
-    // Why is [self window] sometimes null here?
-    UIWindow *w = [[UIApplication sharedApplication] keyWindow];
-    UIViewController *v = [w rootViewController];
+    UIViewController *v = [listWindow rootViewController];
     if ([v isKindOfClass: [UINavigationController class]]) {
+# if TARGET_IPHONE_SIMULATOR
+      NSLog (@"simulating shake on saver list");
+# endif
       UINavigationController *n = (UINavigationController *) v;
       [[n topViewController] motionEnded: UIEventSubtypeMotionShake
                                withEvent: nil];
     }
   } else {     // Not launching another, animate our return to the list.
+# if TARGET_IPHONE_SIMULATOR
+    NSLog (@"fading back to saver list");
+# endif
+    UIWindow *saverWindow = [self window]; // not SaverRunner.window
+    [listWindow setHidden:NO];
     [UIView animateWithDuration: 0.5
             animations:^{ fader.alpha = 0.0; }
             completion:^(BOOL finished) {
                [fader removeFromSuperview];
                fader.alpha = 1.0;
+               [saverWindow setHidden:YES];
+               [listWindow makeKeyAndVisible];
+               [[[listWindow rootViewController] view] becomeFirstResponder];
             }];
   }
 }
 
 
+/* Whether the shape of the X11 Window should be changed to HxW when the
+   device is in a landscape orientation.  X11 hacks want this, but OpenGL
+   hacks do not.
+ */
+- (BOOL)reshapeRotatedWindow
+{
+  return YES;
+}
+
+
 /* Called after the device's orientation has changed.
+   
+   Rotation is complicated: the UI, X11 and OpenGL work in 3 different ways.
+
+   The UI (list of savers, preferences panels) is rotated by the system,
+   because its UIWindow is under a UINavigationController that does
+   automatic rotation, using Core Animation.
+
+   The savers are under a different UIWindow and a UINavigationController
+   that does not do automatic rotation.
+
+   We have to do it this way for OpenGL savers because using Core Animation
+   on an EAGLContext causes the OpenGL pipeline to fall back on software
+   rendering and performance goes to hell.
+
+   For X11-only savers, we could just use Core Animation and let the system
+   handle it, but (maybe) it's simpler to do it the same way for X11 and GL.
+
+   During and after rotation, the size/shape of the X11 window changes,
+   and ConfigureNotify events are generated.
 
-   Note: we could include a subclass of UIViewController which
-   contains a shouldAutorotateToInterfaceOrientation method that
-   returns YES, in which case Core Animation would auto-rotate our
-   View for us in response to rotation events... but, that interacts
-   badly with the EAGLContext -- if you introduce Core Animation into
-   the path, the OpenGL pipeline probably falls back on software
-   rendering and performance goes to hell.  Also, the scaling and
-   rotation that Core Animation does interacts incorrectly with the GL
-   context anyway.
+   X11 code (jwxyz) continues to draw into the (reshaped) backbuffer, which
+   rotated at the last minute via a CGAffineTransformMakeRotation when it is
+   copied to the display hardware.
 
-   So, we have to hack the rotation animation manually, in the GL world.
+   GL code always recieves a portrait-oriented X11 Window whose size never
+   changes.  The GL COLOR_BUFFER is displayed on the hardware directly and
+   unrotated, so the GL hacks themselves are responsible for rotating the
+   GL scene to match current_device_rotation().
 
-   Possibly XScreenSaverView should use Core Animation, and 
-   XScreenSaverGLView should override that.
+   Touch events are converted to mouse clicks, and those XEvent coordinates
+   are reported in the coordinate system currently in use by the X11 window.
+   Again, GL must convert those.
  */
 - (void)didRotate:(NSNotification *)notification
 {
@@ -1688,7 +1767,9 @@ double current_device_rotation (void)
     case UIInterfaceOrientationPortraitUpsideDown:
       current = UIDeviceOrientationPortraitUpsideDown;
       break;
-    case UIInterfaceOrientationLandscapeLeft:          // It's opposite day
+    /* It's opposite day, "because rotating the device to the left requires
+       rotating the content to the right" */
+    case UIInterfaceOrientationLandscapeLeft:
       current = UIDeviceOrientationLandscapeRight;
       break;
     case UIInterfaceOrientationLandscapeRight:
@@ -1758,6 +1839,13 @@ double current_device_rotation (void)
     break;
   }
 
+# if TARGET_IPHONE_SIMULATOR
+  NSLog (@"rotation begun: %s %d -> %s %d; %d x %d",
+         orientname(orientation), (int) rot_current_angle,
+         orientname(new_orientation), (int) angle_to,
+         (int) rot_current_size.width, (int) rot_current_size.height);
+# endif
+
  if (! initted_p) {
    // If we've done a rotation but the saver hasn't been initialized yet,
    // don't bother going through an X11 resize, but just do it now.
@@ -1834,15 +1922,41 @@ double current_device_rotation (void)
 }
 
 
+/* Given a mouse (touch) coordinate in unrotated, unscaled view coordinates,
+   convert it to what X11 and OpenGL expect.
+ */
+- (void) convertMouse:(int)rot x:(int*)x y:(int *)y
+{
+  int w = [self frame].size.width;
+  int h = [self frame].size.height;
+  int xx = *x, yy = *y;
+  int swap;
+
+  if (ignore_rotation_p) {
+    // We need to rotate the coordinates to match the unrotated X11 window.
+    switch (orientation) {
+    case UIDeviceOrientationLandscapeRight:
+      swap = xx; xx = h-yy; yy = swap;
+      break;
+    case UIDeviceOrientationLandscapeLeft:
+      swap = xx; xx = yy; yy = w-swap;
+      break;
+    case UIDeviceOrientationPortraitUpsideDown: 
+      xx = w-xx; yy = h-yy;
+    default:
+      break;
+    }
+  }
 
-- (void) rotateMouse:(int)rot x:(int*)x y:(int *)y w:(int)w h:(int)h
-{
-  // This is a no-op unless contentScaleFactor != hackedContentScaleFactor.
-  // Currently, this is the iPad Retina only.
-  CGRect frame = [self bounds];                // Scale.
-  double s = [self hackedContentScaleFactor];
-  *x *= (backbuffer_size.width  / frame.size.width)  / s;
-  *y *= (backbuffer_size.height / frame.size.height) / s;
+  double s = [self contentScaleFactor];
+  *x = xx * s;
+  *y = yy * s;
+
+# if TARGET_IPHONE_SIMULATOR
+  NSLog (@"touch %4d, %-4d in %4d x %-4d  %d %d\n",
+         *x, *y, (int)(w*s), (int)(h*s),
+         ignore_rotation_p, [self reshapeRotatedWindow]);
+# endif
 }
 
 
@@ -1878,16 +1992,13 @@ double current_device_rotation (void)
 {
   if (!xsft->event_cb || !xwindow) return;
 
-  double s = [self hackedContentScaleFactor];
   XEvent xe;
   memset (&xe, 0, sizeof(xe));
 
-  CGPoint p = [sender locationInView:self];
-  int x = s * p.x;
-  int y = s * p.y;
-  int w = s * [self frame].size.width;  // #### 'frame' here or 'bounds'?
-  int h = s * [self frame].size.height;
-  [self rotateMouse: rot_current_angle x:&x y:&y w:w h:h];
+  CGPoint p = [sender locationInView:self];  // this is in points, not pixels
+  int x = p.x;
+  int y = p.y;
+  [self convertMouse: rot_current_angle x:&x y:&y];
   jwxyz_mouse_moved (xdpy, xwindow, x, y);
 
   switch (sender.state) {
@@ -1940,17 +2051,13 @@ double current_device_rotation (void)
   if (sender.state != UIGestureRecognizerStateEnded)
     return;
 
-  double s = [self hackedContentScaleFactor];
   XEvent xe;
   memset (&xe, 0, sizeof(xe));
 
-  CGPoint p = [sender translationInView:self];
-  int x = s * p.x;
-  int y = s * p.y;
-  int w = s * [self frame].size.width;  // #### 'frame' here or 'bounds'?
-  int h = s * [self frame].size.height;
-  [self rotateMouse: rot_current_angle x:&x y:&y w:w h:h];
-  // jwxyz_mouse_moved (xdpy, xwindow, x, y);
+  CGPoint p = [sender locationInView:self];  // this is in points, not pixels
+  int x = p.x;
+  int y = p.y;
+  [self convertMouse: rot_current_angle x:&x y:&y];
 
   if (abs(x) > abs(y))
     xe.xkey.keycode = (x > 0 ? XK_Right : XK_Left);
index 072634fecfcf2d9fc53f1d2823733f77d0b21a57..3c75a6eef80960cf7018b923cf9ba783e6fdc8dc 100644 (file)
@@ -16,8 +16,8 @@
 \b0 by Jamie Zawinski\
 and many others\
 \
-version 5.30\
-10-Sep-2014\
+version 5.31\
+15-Nov-2014\
 \
 {\field{\*\fldinst{HYPERLINK "http://www.jwz.org/xscreensaver/"}}{\fldrslt \cf2 \ul \ulc2 http://www.jwz.org/xscreensaver/}}\
 \pard\pardeftab720
index ed294aadbab9d8f62d003281f0cb1d865e2acf16..4ac4affacceec4eac997518fd9708277cb840154 100755 (executable)
@@ -1,5 +1,5 @@
 #!/usr/bin/perl -w
-# Copyright Â© 2012-2013 Jamie Zawinski <jwz@jwz.org>
+# Copyright Â© 2012-2014 Jamie Zawinski <jwz@jwz.org>
 #
 # Permission to use, copy, modify, distribute, and sell this software and its
 # documentation for any purpose is hereby granted without fee, provided that
@@ -23,22 +23,71 @@ require 5;
 use strict;
 
 my $progname = $0; $progname =~ s@.*/@@g;
-my $version = q{ $Revision: 1.2 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+my ($version) = ('$Revision: 1.3 $' =~ m/\s(\d[.\d]+)\s/s);
 
 my $verbose = 1;
 
-sub build_h($$) {
-  my ($app_dir, $outfile) = @_;
+# List of savers not included in the iOS build.
+#
+my %disable = (
+   'extrusion'         => 1,
+   'lcdscrub'          => 1,
+   'lockward'          => 1,
+   'webcollage'                => 1,
+  );
+
+# Parse the RETIRED_EXES variable from the Makefiles to populate %disable.
+# Duplicated in ../hacks/munge-ad.pl.
+#
+sub parse_makefiles() {
+  foreach my $mf ( "hacks/Makefile.in", "hacks/glx/Makefile.in" ) {
+    open (my $in, '<', $mf) || error ("$mf: $!");
+    print STDERR "$progname: reading $mf\n" if ($verbose > 1);
+    local $/ = undef;  # read entire file
+    my $body = <$in>;
+    close $in;
+
+    $body =~ s/\\\n//gs;
+    my ($var)  = ($body =~ m/^RETIRED_EXES\s*=\s*(.*)$/mi);
+    my ($var2) = ($body =~ m/^RETIRED_GL_EXES\s*=\s*(.*)$/mi);
+    error ("no RETIRED_EXES in $mf") unless $var;
+    $var .= " $var2" if $var2;
+    foreach my $hack (split (/\s+/, $var)) {
+      $disable{$hack} = 2;
+    }
+  }
+}
 
-  opendir (my $dh, $app_dir) || error ("$app_dir: $!");
-  print STDERR "$progname: scanning $app_dir...\n" if ($verbose > 1);
 
-  my @names = ();
-  foreach (sort (readdir ($dh))) {
-    next unless (m/^(.*)\.xml$/);
-    push @names, $1;
+sub build_h($) {
+  my ($outfile) = @_;
+
+  parse_makefiles();
+
+  my @schemes = glob('xscreensaver.xcodeproj/xcuserdata/' .
+                     '*.xcuserdatad/xcschemes/*.xcscheme');
+  error ("no scheme files") unless (@schemes);
+
+  my %names = ();
+
+  foreach my $s (@schemes) {
+    open (my $in, '<', $s) || error ("$s: $!");
+    local $/ = undef;  # read entire file
+    my $body = <$in>;
+    close $in;
+    my ($name) = ($body =~ m@BuildableName *= *"([^\"<>]+?)\.saver"@s);
+    next unless $name;
+    $name = lc($name);
+    if ($disable{$name}) {
+      print STDERR "$progname: skipping $name\n" if ($verbose > 1);
+      next;
+    }
+    print STDERR "$progname: found $name\n" if ($verbose > 1);
+    $names{$name} = 1;
   }
-  closedir $dh;
+
+  my @names = sort (keys %names);
+  error ("too few names") if (@names < 100);
 
   my $suf = 'xscreensaver_function_table';
 
@@ -112,25 +161,24 @@ sub error($) {
 }
 
 sub usage() {
-  print STDERR "usage: $progname [--verbose] program.app output.c\n";
+  print STDERR "usage: $progname [--verbose] output.c\n";
   exit 1;
 }
 
 sub main() {
 
-  my ($app, $out);
+  my ($out);
   while ($_ = $ARGV[0]) {
     shift @ARGV;
     if    (m/^--?verbose$/s)  { $verbose++; }
     elsif (m/^-v+$/)          { $verbose += length($_)-1; }
     elsif (m/^--?q(uiet)?$/s) { $verbose = 0; }
     elsif (m/^-/s)            { usage(); }
-    elsif (! $app)            { $app = $_; }
     elsif (! $out)            { $out = $_; }
     else                      { usage(); }
   }
-  usage() unless ($out && $app);
-  build_h ($app, $out);
+  usage() unless ($out);
+  build_h ($out);
 }
 
 main();
index 15615adc8d4e19666130cca7cb5969778dbe752a..ad17fa9b4eba0cd391189a5202fe0411bed91e39 100644 (file)
@@ -2,46 +2,16 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
 <dict>
-       <key>CFBundleName</key>
-       <string>${PRODUCT_NAME}</string>
-       <key>NSHumanReadableCopyright</key>
-       <string>5.30</string>
        <key>CFBundleDevelopmentRegion</key>
        <string>English</string>
-       <key>CFBundleVersion</key>
-       <string>5.30</string>
-       <key>NSMainNibFile</key>
-       <string>iSaverRunner</string>
-       <key>CFBundlePackageType</key>
-       <string>APPL</string>
-       <key>CFBundleIconFile</key>
-       <string>iSaverRunner57.png</string>
-       <key>UIViewControllerBasedStatusBarAppearance</key>
-       <false/>
-       <key>CFBundleShortVersionString</key>
-       <string>5.30</string>
-       <key>CFBundleInfoDictionaryVersion</key>
-       <string>6.0</string>
-       <key>UIRequiredDeviceCapabilities</key>
-       <dict>
-               <key>opengles-1</key>
-               <true/>
-       </dict>
+       <key>CFBundleDisplayName</key>
+       <string>${PRODUCT_NAME}</string>
        <key>CFBundleExecutable</key>
        <string>${EXECUTABLE_NAME}</string>
-       <key>UISupportedInterfaceOrientations~ipad</key>
-       <array>
-               <string>UIInterfaceOrientationPortrait</string>
-               <string>UIInterfaceOrientationPortraitUpsideDown</string>
-               <string>UIInterfaceOrientationLandscapeLeft</string>
-               <string>UIInterfaceOrientationLandscapeRight</string>
-       </array>
-       <key>CFBundleLongVersionString</key>
-       <string>5.30</string>
-       <key>CFBundleIdentifier</key>
-       <string>${BUNDLE_IDENTIFIER}</string>
-       <key>CFBundleSignature</key>
-       <string>????</string>
+       <key>CFBundleGetInfoString</key>
+       <string>5.31</string>
+       <key>CFBundleIconFile</key>
+       <string>iSaverRunner57.png</string>
        <key>CFBundleIconFiles</key>
        <array>
                <string>iSaverRunner152.png</string>
                <string>iSaverRunner50.png</string>
                <string>iSaverRunner29.png</string>
        </array>
+       <key>CFBundleIdentifier</key>
+       <string>${BUNDLE_IDENTIFIER}</string>
+       <key>CFBundleInfoDictionaryVersion</key>
+       <string>6.0</string>
+       <key>CFBundleLongVersionString</key>
+       <string>5.31</string>
+       <key>CFBundleName</key>
+       <string>${PRODUCT_NAME}</string>
+       <key>CFBundlePackageType</key>
+       <string>APPL</string>
+       <key>CFBundleShortVersionString</key>
+       <string>5.31</string>
+       <key>CFBundleSignature</key>
+       <string>????</string>
+       <key>CFBundleVersion</key>
+       <string>5.31</string>
        <key>LSRequiresIPhoneOS</key>
        <true/>
+       <key>NSHumanReadableCopyright</key>
+       <string>5.31</string>
+       <key>NSMainNibFile</key>
+       <string>iSaverRunner</string>
+       <key>UIRequiredDeviceCapabilities</key>
+       <dict>
+               <key>opengles-1</key>
+               <true/>
+       </dict>
        <key>UISupportedInterfaceOrientations</key>
        <array>
                <string>UIInterfaceOrientationPortrait</string>
                <string>UIInterfaceOrientationLandscapeRight</string>
                <string>UIInterfaceOrientationPortraitUpsideDown</string>
        </array>
-       <key>CFBundleDisplayName</key>
-       <string>${PRODUCT_NAME}</string>
-       <key>CFBundleGetInfoString</key>
-       <string>5.30</string>
+       <key>UISupportedInterfaceOrientations~ipad</key>
+       <array>
+               <string>UIInterfaceOrientationPortrait</string>
+               <string>UIInterfaceOrientationPortraitUpsideDown</string>
+               <string>UIInterfaceOrientationLandscapeLeft</string>
+               <string>UIInterfaceOrientationLandscapeRight</string>
+       </array>
+       <key>UIViewControllerBasedStatusBarAppearance</key>
+       <false/>
 </dict>
 </plist>
diff --git a/OSX/iSaverRunner29t.png b/OSX/iSaverRunner29t.png
deleted file mode 100644 (file)
index 52e2406..0000000
Binary files a/OSX/iSaverRunner29t.png and /dev/null differ
diff --git a/OSX/iSaverRunner57t.png b/OSX/iSaverRunner57t.png
new file mode 100644 (file)
index 0000000..d4e15e3
Binary files /dev/null and b/OSX/iSaverRunner57t.png differ
index 329a7c18574ae7425563053a7038d005920761a9..05e1b23f36e0e3200a8f4e9f7e6749b8fdf752c4 100755 (executable)
@@ -71,7 +71,8 @@ PU="$DSTVOLUME/$HOME/Library/Screen Savers"
 # is in the DMG, and we remove the leading dot when installing it.
 # Without this, auto-updates won't work right.
 #
-UPDATER=".XScreenSaverUpdater.app"
+UPDATER_SRC="XScreenSaver.updater"
+UPDATER_DST="XScreenSaverUpdater.app"
 
 
 cd "$SRC" || error "The 'Screen Savers' folder does not exist.
@@ -94,20 +95,26 @@ mkdir -p "$DST2" || error "Unable to create directory $DST2/"
 # Install the savers and the updater in /System/Library/Screen Savers/
 # Install the other apps in /Applications/
 #
-for f in *.{saver,app} "$UPDATER" ; do
+for f in *.{saver,app} "$UPDATER_SRC" ; do
   EXT=`echo "$f" | sed 's/^.*\.//'`
-  if [ "$EXT" = "app" -a "$f" != "$UPDATER" ]; then
+  if [ "$f" = "$UPDATER_SRC" ]; then
+    DST="$DST1"
+  elif [ "$EXT" = "app" ]; then
     DST="$DST2"
   else
     DST="$DST1"
   fi
 
-  f2=`echo "$f" | sed 's/^\.//'`   # install ".foo" as "foo"
-  DD="$DST/$f2"
+  DD="$DST/$f"
 
   echo "Installing $DD" >&2
   rm -rf "$DD" || error "Unable to delete $DD"
-  cp -pR "$f" "$DD/" || error "Unable to install $f in $DST/"
+
+  if [ "$f" = "$UPDATER_SRC" ]; then
+    ( cd "$DST/" && tar -xzf - ) < "$f" || error "Unable to unpack $f in $DST/"
+  else
+    cp -pR "$f" "$DD" || error "Unable to install $f in $DST/"
+  fi
 
   # Eliminate the "this was downloaded from the interweb" warning.
   xattr -r -d com.apple.quarantine "$DD"
index e864855eb1ca910256703059380941cea3571d92..11d76b0ecaff2128d5b8106e1b6381043a9e57ae 100644 (file)
@@ -1,5 +1,5 @@
 /* Generated file, do not edit.
-   Created: Wed Jul 30 23:28:05 2014 by build-fntable.pl 1.2.
+   Created: Fri Nov 14 19:37:08 2014 by build-fntable.pl 1.3.
  */
 
 #import <Foundation/Foundation.h>
@@ -20,6 +20,7 @@ extern struct xscreensaver_function_table
  *attraction_xscreensaver_function_table,
  *atunnel_xscreensaver_function_table,
  *barcode_xscreensaver_function_table,
+ *binaryring_xscreensaver_function_table,
  *blaster_xscreensaver_function_table,
  *blinkbox_xscreensaver_function_table,
  *blitspin_xscreensaver_function_table,
@@ -38,6 +39,7 @@ extern struct xscreensaver_function_table
  *ccurve_xscreensaver_function_table,
  *celtic_xscreensaver_function_table,
  *circuit_xscreensaver_function_table,
+ *cityflow_xscreensaver_function_table,
  *cloudlife_xscreensaver_function_table,
  *companioncube_xscreensaver_function_table,
  *compass_xscreensaver_function_table,
@@ -79,6 +81,7 @@ extern struct xscreensaver_function_table
  *galaxy_xscreensaver_function_table,
  *gears_xscreensaver_function_table,
  *geodesic_xscreensaver_function_table,
+ *geodesicgears_xscreensaver_function_table,
  *gflux_xscreensaver_function_table,
  *glblur_xscreensaver_function_table,
  *glcells_xscreensaver_function_table,
@@ -233,6 +236,7 @@ NSDictionary *make_function_table_dict(void)
        [NSValue valueWithPointer:&attraction_xscreensaver_function_table], @"attraction",
        [NSValue valueWithPointer:&atunnel_xscreensaver_function_table], @"atunnel",
        [NSValue valueWithPointer:&barcode_xscreensaver_function_table], @"barcode",
+       [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",
@@ -251,6 +255,7 @@ NSDictionary *make_function_table_dict(void)
        [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",
@@ -292,6 +297,7 @@ NSDictionary *make_function_table_dict(void)
        [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:&glblur_xscreensaver_function_table], @"glblur",
        [NSValue valueWithPointer:&glcells_xscreensaver_function_table], @"glcells",
index 48466f20af010219814310a7f56a2a29b9a5c343..c861d73681e772526b8abe1f0d0d3990affa1d10 100644 (file)
@@ -73,7 +73,7 @@ ios_random_image_done (ios_loader_data *d, BOOL ok)
                      scale: 1
                      orientation: orient];
       if (img)
-        fn = [[rep filename] cStringUsingEncoding:NSISOLatin1StringEncoding];
+        fn = [[rep filename] cStringUsingEncoding:NSUTF8StringEncoding];
     }
   }
 
index 82a8b2edff511b6f74f507101fd309690d0a2aa5..0d7ebe8b18e302ecb974946db05e156a96e0a968 100644 (file)
@@ -48,9 +48,11 @@ typedef struct jwxyz_XrmDatabase *      XrmDatabase;
 typedef struct jwxyz_XImage            XImage;
 typedef struct jwxyz_XFontStruct       XFontStruct;
 typedef struct jwxyz_Font *            Font;
+typedef struct jwxyz_XFontSet *                XFontSet;
 typedef struct jwxyz_XCharStruct       XCharStruct;
 typedef struct jwxyz_XComposeStatus    XComposeStatus;
 typedef struct jwxyz_XPixmapFormatValues XPixmapFormatValues;
+typedef struct jwxyz_XChar2b            XChar2b;
 
 typedef union  jwxyz_XEvent            XEvent;
 typedef struct jwxyz_XAnyEvent         XAnyEvent;
@@ -365,6 +367,8 @@ extern int XDrawString (Display *, Drawable, GC, int x, int y, const char *,
                         int len);
 extern int XDrawImageString (Display *, Drawable, GC, int x, int y, 
                              const char *, int len);
+extern int XDrawString16 (Display *, Drawable, GC, int x, int y,
+                          const XChar2b *, int len);
 
 extern Bool XQueryPointer (Display *, Window, Window *root_ret,
                            Window *child_ret,
@@ -420,9 +424,24 @@ extern int XUnloadFont (Display *, Font);
 extern int XTextExtents (XFontStruct *, const char *, int length,
                          int *dir_ret, int *ascent_ret, int *descent_ret,
                          XCharStruct *overall_ret);
+extern int XTextExtents16 (XFontStruct *, const XChar2b *, int length,
+                           int *dir_ret, int *ascent_ret, int *descent_ret,
+                           XCharStruct *overall_ret);
 extern int XTextWidth (XFontStruct *, const char *, int length);
 extern int XSetFont (Display *, GC, Font);
 
+extern XFontSet XCreateFontSet (Display *, char *name, 
+                                char ***missing_charset_list_return,
+                                int *missing_charset_count_return,
+                                char **def_string_return);
+extern void XFreeFontSet (Display *, XFontSet);
+extern void XFreeStringList (char **);
+extern int Xutf8TextExtents (XFontSet, const char *, int num_bytes,
+                             XRectangle *overall_ink_return,
+                             XRectangle *overall_logical_return);
+extern void Xutf8DrawString (Display *, Drawable, XFontSet, GC,
+                             int x, int y, const char *, int num_bytes);
+
 extern Pixmap XCreatePixmap (Display *, Drawable,
                              unsigned int width, unsigned int height,
                              unsigned int depth);
@@ -453,6 +472,7 @@ extern int visual_depth (Screen *, Visual *);
 extern int visual_cells (Screen *, Visual *);
 extern int visual_class (Screen *, Visual *);
 extern int get_bits_per_pixel (Display *, int);
+extern int screen_number (Screen *);
 
 // also declared in utils/grabclient.h
 extern Bool use_subwindow_mode_p (Screen *, Window);
@@ -695,11 +715,11 @@ struct jwxyz_XImage {
 };
 
 struct jwxyz_XCharStruct {
-  short        lbearing;       /* origin to left edge of raster */
-  short        rbearing;       /* origin to right edge of raster */
+  short        lbearing;       /* origin to left edge of ink */
+  short        rbearing;       /* origin to right edge of ink */
   short        width;          /* advance to next char's origin */
-  short        ascent;         /* baseline to top edge of raster */
-  short        descent;        /* baseline to bottom edge of raster */
+  short        ascent;         /* baseline to top edge of ink */
+  short        descent;        /* baseline to bottom edge of ink */
 #if 0
   unsigned short attributes;   /* per char flags (not predefined) */
 #endif
@@ -742,4 +762,9 @@ struct  jwxyz_XPixmapFormatValues {
   int scanline_pad;
 };
 
+struct jwxyz_XChar2b {
+  unsigned char byte1;
+  unsigned char byte2;
+};
+
 #endif /* __JWXYZ_H__ */
index 330d0632adfab3a5d34fe4f39daf074629c5d0e0..78a9bc56043bbf7bf8eac7d2601e37aa4eff1831 100644 (file)
@@ -47,6 +47,7 @@
 #import "jwxyz.h"
 #import "jwxyz-timers.h"
 #import "yarandom.h"
+#import "utf8wc.h"
 
 # define USE_BACKBUFFER  /* must be in sync with XScreenSaverView.h */
 
@@ -116,6 +117,10 @@ struct jwxyz_Font {
   XFontStruct metrics;
 };
 
+struct jwxyz_XFontSet {
+  Font font;
+};
+
 
 /* Instead of calling abort(), throw a real exception, so that
    XScreenSaverView can catch it and display a dialog.
@@ -2477,7 +2482,8 @@ copy_pixmap (Display *dpy, Pixmap p)
    "rbearing" is the distance from the logical origin to the rightmost pixel.
 
    "descent" is the distance from the logical origin to the bottommost pixel.
-   For characters with descenders, it is negative.
+   For characters with descenders, it is positive.  For superscripts, it
+   is negative.
 
    "ascent" is the distance from the logical origin to the topmost pixel.
    It is the number of pixels above the baseline.
@@ -2490,6 +2496,46 @@ copy_pixmap (Display *dpy, Pixmap p)
  */
 
 
+static void
+glyph_metrics (CTFontRef ctfont, CGGlyph cgglyph, XCharStruct *cs)
+{
+  CGRect bbox = CTFontGetBoundingRectsForGlyphs (ctfont,
+                                                 kCTFontDefaultOrientation,
+                                                 &cgglyph, NULL, 1);
+  CGSize advancement;
+  CTFontGetAdvancesForGlyphs (ctfont, kCTFontDefaultOrientation,
+                              &cgglyph, &advancement, 1);
+
+# ifndef USE_IPHONE
+  // Only necessary for when LCD smoothing is enabled, which iOS doesn't do.
+  bbox.origin.x    -= 2.0/3.0;
+  bbox.size.width  += 4.0/3.0;
+  bbox.size.height += 1.0/2.0;
+# endif
+
+//#define CEIL(F)  ((F) < 0 ? floor(F) : ceil(F))
+//#define FLOOR(F) ((F) < 0 ? ceil(F) : floor(F))
+#define CEIL(F)  ceil(F)
+#define FLOOR(F) floor(F)
+
+  /* Now that we know the advancement and bounding box, we can compute
+     the lbearing and rbearing.
+   */
+//cs->ascent   = CEIL (bbox.origin.y) + CEIL (bbox.size.height);
+  cs->ascent   = CEIL (bbox.origin.y + bbox.size.height);
+  cs->descent  = CEIL(-bbox.origin.y);
+  cs->lbearing = FLOOR (bbox.origin.x);
+//cs->rbearing = CEIL (bbox.origin.x) + CEIL (bbox.size.width);
+  cs->rbearing = CEIL (bbox.origin.x + bbox.size.width);
+  cs->width    = FLOOR (advancement.width + 0.5);
+
+  //  Assert (cs->rbearing - cs->lbearing == CEIL(bbox.size.width), 
+  //          "bbox w wrong");
+  //  Assert (cs->ascent   + cs->descent  == CEIL(bbox.size.height),
+  //          "bbox h wrong");
+}
+
+
 // This is XQueryFont, but for the XFontStruct embedded in 'Font'
 //
 static void
@@ -2511,11 +2557,6 @@ query_font (Font fid)
   XCharStruct *min = &f->min_bounds;
   XCharStruct *max = &f->max_bounds;
 
-//#define CEIL(F)  ((F) < 0 ? floor(F) : ceil(F))
-//#define FLOOR(F) ((F) < 0 ? ceil(F) : floor(F))
-#define CEIL(F)  ceil(F)
-#define FLOOR(F) floor(F)
-
   f->fid               = fid;
   f->min_char_or_byte2 = first;
   f->max_char_or_byte2 = last;
@@ -2539,8 +2580,7 @@ query_font (Font fid)
   Assert (ctfont, @"no CTFontRef for UIFont");
 
   for (i = first; i <= last; i++) {
-    CGSize advancement = CGSizeMake (0, 0);
-    CGRect bbox = CGRectMake (0, 0, 0, 0);
+    XCharStruct *cs = &f->per_char[i-first];
 
     /* There is no way to get "lbearing", "rbearing" or "descent" out of
        NSFont.  'sizeWithFont' gives us "width" and "height" only.
@@ -2554,18 +2594,10 @@ query_font (Font fid)
     CGGlyph cgglyph = 0;
 
     if (CTFontGetGlyphsForCharacters (ctfont, &i, &cgglyph, 1))
-      {
-        bbox = CTFontGetBoundingRectsForGlyphs (ctfont,
-                                                kCTFontDefaultOrientation,
-                                                &cgglyph, NULL, 1);
-        CTFontGetAdvancesForGlyphs (ctfont, kCTFontDefaultOrientation,
-                                    &cgglyph, &advancement, 1);
-      }
+      glyph_metrics (ctfont, cgglyph, cs);
     else
-      {
-        // This is normal, since Latin1 does not encode 0-31 or 127-159.
-        // NSLog (@"no glyph for character %d\n", i);
-      }
+      // This is normal, since Latin1 does not encode 0-31 or 127-159.
+      memset (cs, 0, sizeof(*cs));
 
 # if 0
     if (i == 224) {  // Latin1 == "agrave", MacRoman == "daggerdouble".
@@ -2580,32 +2612,7 @@ query_font (Font fid)
                                      cgglyph);
       Assert ([glyph_name isEqualToString:@"uacute"], @"wrong encoding");
     }
-# endif // 9
-
-# ifndef USE_IPHONE
-    // Only necessary for when LCD smoothing is enabled, which iOS doesn't do.
-    bbox.origin.x    -= 2.0/3.0;
-    bbox.size.width  += 4.0/3.0;
-    bbox.size.height += 1.0/2.0;
-# endif
-    /* Now that we know the advancement and bounding box, we can compute
-       the lbearing and rbearing.
-     */
-    XCharStruct *cs = &f->per_char[i-first];
-
-//    cs->ascent   = CEIL (bbox.origin.y) + CEIL (bbox.size.height);
-    cs->ascent   = CEIL (bbox.origin.y + bbox.size.height);
-    cs->descent  = CEIL(-bbox.origin.y);
-    cs->lbearing = FLOOR (bbox.origin.x);
-//  cs->rbearing = CEIL (bbox.origin.x) + CEIL (bbox.size.width);
-    cs->rbearing = CEIL (bbox.origin.x + bbox.size.width);
-    cs->width    = FLOOR (advancement.width + 0.5);
-
-//  Assert (cs->rbearing - cs->lbearing == CEIL(bbox.size.width), 
-//          "bbox w wrong");
-//  Assert (cs->ascent   + cs->descent  == CEIL(bbox.size.height),
-//          "bbox h wrong");
+# endif // 0
 
     max->width    = MAX (max->width,    cs->width);
     max->ascent   = MAX (max->ascent,   cs->ascent);
@@ -3061,14 +3068,57 @@ XSetFont (Display *dpy, GC gc, Font fid)
   return 0;
 }
 
+
+XFontSet
+XCreateFontSet (Display *dpy, char *name, 
+                char ***missing_charset_list_return,
+                int *missing_charset_count_return,
+                char **def_string_return)
+{
+  char *name2 = strdup (name);
+  char *s = strchr (name, ",");
+  if (s) *s = 0;
+  XFontSet set = 0;
+  Font f = XLoadFont (dpy, name2);
+  if (f)
+    {
+      set = (XFontSet) calloc (1, sizeof(*set));
+      set->font = f;
+    }
+  free (name2);
+  if (missing_charset_list_return)  *missing_charset_list_return = 0;
+  if (missing_charset_count_return) *missing_charset_count_return = 0;
+  if (def_string_return) *def_string_return = 0;
+  return set;
+}
+
+
+void
+XFreeFontSet (Display *dpy, XFontSet set)
+{
+  XUnloadFont (dpy, set->font);
+  free (set);
+}
+
+
+void
+XFreeStringList (char **list)
+{
+  int i;
+  if (!list) return;
+  for (i = 0; list[i]; i++)
+    XFree (list[i]);
+  XFree (list);
+}
+
+
 int
 XTextExtents (XFontStruct *f, const char *s, int length,
               int *dir_ret, int *ascent_ret, int *descent_ret,
               XCharStruct *cs)
 {
   memset (cs, 0, sizeof(*cs));
-  int i;
-  for (i = 0; i < length; i++) {
+  for (int i = 0; i < length; i++) {
     unsigned char c = (unsigned char) s[i];
     if (c < f->min_char_or_byte2 || c > f->max_char_or_byte2)
       c = f->default_char;
@@ -3099,24 +3149,118 @@ XTextWidth (XFontStruct *f, const char *s, int length)
 }
 
 
-static int
-draw_string (Display *dpy, Drawable d, GC gc, int x, int y,
-             const char  *str, int len, BOOL clear_background_p)
+int
+XTextExtents16 (XFontStruct *f, const XChar2b *s, int length,
+                int *dir_ret, int *ascent_ret, int *descent_ret,
+                XCharStruct *cs)
 {
-  if (clear_background_p) {
-    int ascent, descent, dir;
+  Font fid = f->fid;
+  CTFontRef ctfont =
+    CTFontCreateWithName ((CFStringRef) [fid->nsfont fontName],
+                          [fid->nsfont pointSize],
+                          NULL);
+  Assert (ctfont, @"no CTFontRef for UIFont");
+
+  int utf8_len = 0;
+  char *utf8 = XChar2b_to_utf8 (s, &utf8_len);
+  NSString *nsstr = [NSString stringWithCString:utf8
+                                       encoding:NSUTF8StringEncoding];
+  NSUInteger L = [nsstr length];
+
+  for (int i = 0; i < L; i++) {
+    unichar c = [nsstr characterAtIndex:i];
+    XCharStruct cc;
+    CGGlyph cgglyph = 0;
+
+    if (CTFontGetGlyphsForCharacters (ctfont, &c, &cgglyph, 1))
+      glyph_metrics (ctfont, cgglyph, &cc);
+    else
+      // This is normal, since Latin1 does not encode 0-31 or 127-159.
+      memset (&cc, 0, sizeof(cc));
+
+    if (i == 0) {
+      *cs = cc;
+    } else {
+      cs->ascent   = MAX (cs->ascent,   cc.ascent);
+      cs->descent  = MAX (cs->descent,  cc.descent);
+      cs->lbearing = MIN (cs->lbearing, cs->width + cc.lbearing);
+      cs->rbearing = MAX (cs->rbearing, cs->width + cc.rbearing);
+      cs->width   += cc.width;
+    }
+  }
+  *dir_ret = 0;
+  *ascent_ret  = f->ascent;
+  *descent_ret = f->descent;
+
+  free (utf8);
+  CFRelease (ctfont);
+
+  return 0;
+}
+
+
+int
+Xutf8TextExtents (XFontSet set, const char *str, int num_bytes,
+                  XRectangle *overall_ink_return,
+                  XRectangle *overall_logical_return)
+{
+  Font fid = set->font;
+  CTFontRef ctfont =
+    CTFontCreateWithName ((CFStringRef) [fid->nsfont fontName],
+                          [fid->nsfont pointSize],
+                          NULL);
+  Assert (ctfont, @"no CTFontRef for UIFont");
+
+  NSString *nsstr = [NSString stringWithCString:str
+                                       encoding:NSUTF8StringEncoding];
+  NSUInteger L = [nsstr length];
+
+  XRectangle ink = { 0, };
+  XRectangle logical = { 0, };
+
+  logical.height = fid->metrics.ascent;
+
+  for (int i = 0; i < L; i++) {
+    unichar c = [nsstr characterAtIndex:i];
     XCharStruct cs;
-    XTextExtents (&gc->gcv.font->metrics, str, len,
-                  &dir, &ascent, &descent, &cs);
-    draw_rect (dpy, d, gc,
-               x + MIN (0, cs.lbearing),
-               y - MAX (0, ascent),
-               MAX (MAX (0, cs.rbearing) -
-                    MIN (0, cs.lbearing),
-                    cs.width),
-               MAX (0, ascent) + MAX (0, descent),
-               NO, YES);
+    CGGlyph cgglyph = 0;
+
+    if (CTFontGetGlyphsForCharacters (ctfont, &c, &cgglyph, 1))
+      glyph_metrics (ctfont, cgglyph, &cs);
+    else
+      // This is normal, since Latin1 does not encode 0-31 or 127-159.
+      memset (&cs, 0, sizeof(cs));
+
+    logical.width += cs.width;
+
+    ink.height = MAX(ink.height, cs.ascent);
+    ink.y      = MIN(ink.y,      cs.descent);
+
+    if (i == 0)
+      ink.x = cs.lbearing;
+
+    if (i == L-1) {
+      ink.width += cs.rbearing;
+    } else {
+      ink.width += cs.width;
+    }
   }
+    
+  CFRelease (ctfont);
+
+  if (overall_ink_return)
+    *overall_ink_return = ink;
+  if (overall_logical_return)
+    *overall_logical_return = logical;
+  return 0;
+}
+
+
+static int
+draw_string (Display *dpy, Drawable d, GC gc, int x, int y,
+             NSString *nsstr)
+{
+  if (! nsstr) return 1;
 
   CGRect wr = d->frame;
   CGContextRef cgc = d->cgc;
@@ -3145,11 +3289,6 @@ draw_string (Display *dpy, Drawable d, GC gc, int x, int y,
   //
   set_color (cgc, argb, 32, NO, YES);
 
-  char *s2 = (char *) malloc (len + 1);
-  strncpy (s2, str, len);
-  s2[len] = 0;
-  NSString *nsstr = [NSString stringWithCString:s2
-                                       encoding:NSISOLatin1StringEncoding];
   NSAttributedString *astr = [[NSAttributedString alloc]
                                initWithString:nsstr
                                    attributes:attr];
@@ -3171,14 +3310,69 @@ int
 XDrawString (Display *dpy, Drawable d, GC gc, int x, int y,
              const char  *str, int len)
 {
-  return draw_string (dpy, d, gc, x, y, str, len, NO);
+  char *s2 = (char *) malloc (len + 1);
+  strncpy (s2, str, len);
+  s2[len] = 0;
+  NSString *nsstr = [NSString stringWithCString:s2
+                                       encoding:NSISOLatin1StringEncoding];
+  int ret = draw_string (dpy, d, gc, x, y, nsstr);
+  free (s2);
+  return ret;
+}
+
+
+int
+XDrawString16 (Display *dpy, Drawable d, GC gc, int x, int y,
+             const XChar2b *str, int len)
+{
+  char *s2 = XChar2b_to_utf8 (str, 0);
+  NSString *nsstr = [NSString stringWithCString:s2
+                                       encoding:NSUTF8StringEncoding];
+  if (! nsstr)
+    /* If the C string has invalid UTF8 bytes in it, the result is
+       "undefined", which turns out to mean "return a null string"
+       instead of just omitting the bogus characters. Greaaat.
+       So try it again as Latin1, I guess. */
+    nsstr = [NSString stringWithCString:s2 encoding:NSISOLatin1StringEncoding];
+  int ret = draw_string (dpy, d, gc, x, y, nsstr);
+  free (s2);
+  return ret;
+}
+
+
+void
+Xutf8DrawString (Display *dpy, Drawable d, XFontSet set, GC gc,
+                 int x, int y, const char *str, int len)
+{
+  char *s2 = (char *) malloc (len + 1);
+  strncpy (s2, str, len);
+  s2[len] = 0;
+  NSString *nsstr = [NSString stringWithCString:s2
+                                       encoding:NSUTF8StringEncoding];
+  if (! nsstr)
+    nsstr = [NSString stringWithCString:s2 encoding:NSISOLatin1StringEncoding];
+  draw_string (dpy, d, gc, x, y, nsstr);
+  free (s2);
 }
 
+
 int
 XDrawImageString (Display *dpy, Drawable d, GC gc, int x, int y,
                   const char *str, int len)
 {
-  return draw_string (dpy, d, gc, x, y, str, len, YES);
+  int ascent, descent, dir;
+  XCharStruct cs;
+  XTextExtents (&gc->gcv.font->metrics, str, len,
+                &dir, &ascent, &descent, &cs);
+  draw_rect (dpy, d, gc,
+             x + MIN (0, cs.lbearing),
+             y - MAX (0, ascent),
+             MAX (MAX (0, cs.rbearing) -
+                  MIN (0, cs.lbearing),
+                  cs.width),
+             MAX (0, ascent) + MAX (0, descent),
+             NO, YES);
+  return XDrawString (dpy, d, gc, x, y, str, len);
 }
 
 
@@ -3490,6 +3684,18 @@ get_bits_per_pixel (Display *dpy, int depth)
   return depth;
 }
 
+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;
+  abort ();
+  return 0;
+}
+
 // declared in utils/grabclient.h
 Bool
 use_subwindow_mode_p (Screen *screen, Window window)
index 1f5eccee7c3c56f75d0ca49a97a0f6d697bbf3c7..da95f4aea3f1b2398461240cbc4f09d25400cd0f 100755 (executable)
@@ -1,5 +1,5 @@
 #!/usr/bin/perl -w
-# Copyright Â© 2006-2013 Jamie Zawinski <jwz@jwz.org>
+# Copyright Â© 2006-2014 Jamie Zawinski <jwz@jwz.org>
 #
 # Permission to use, copy, modify, distribute, and sell this software and its
 # documentation for any purpose is hereby granted without fee, provided that
@@ -18,7 +18,7 @@ require 5;
 use strict;
 
 my $progname = $0; $progname =~ s@.*/@@g;
-my $version = q{ $Revision: 1.3 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+my ($version) = ('$Revision: 1.4 $' =~ m/\s(\d[.\d]+)\s/s);
 
 my $verbose = 1;
 
@@ -92,6 +92,7 @@ sub update($$) {
                      rand(0xFFFFFFFF));
   my @cmd = ("convert",
              $img, 
+             "-strip",
              "-resize", $size . "^",
              "-gravity", "center",
              "-extent", $size,
index a12f641dbdd126b04759d3d0f443aaeb4d9d4fe2..0e17790f955e9430829de3c63c3d51d1555e8467 100644 (file)
@@ -7,6 +7,17 @@
   <link>http://www.jwz.org/xscreensaver/updates.xml</link>
   <description>Updates to xscreensaver.</description>
   <language>en</language>
+  <item>
+   <title>Version 5.30</title>
+   <link>http://www.jwz.org/xscreensaver/xscreensaver-5.30.dmg</link>
+   <description><![CDATA[&bull; New hack, `winduprobot'. <BR>&bull; Many improvements to `lament', including Leviathan. <BR>&bull; Fixed the normals in `flyingtoasters': shading is correct now. <BR>&bull; Implemented TEXTURE_GEN in GLES: flying toast is now toasted on iOS. <BR>&bull; Make cel-shading sort-of work in `skytentacles' on iOS. <BR>&bull; Fixed dragging-to-rotate on rotated iOS devices, I think. <BR>&bull; Dragging has inertia now. <BR>&bull; Most hacks respond to mouse-clicks, double-taps and swipes as meaning "do something different now". <BR>&bull; Reworked OpenGL fonts. <BR>&bull; The OSX auto-update installer wasn't working. This time for sure? <BR>&bull; Various minor fixes.]]></description>
+   <pubDate>Wed, 10 Sep 2014 22:04:30 -0700</pubDate>
+   <enclosure url="http://www.jwz.org/xscreensaver/xscreensaver-5.30.dmg"
+    sparkle:version="5.30"
+    sparkle:dsaSignature="MC0CFDPqS6izb2TmEZpWMTqOwsOs3XiTAhUAoqdy8mZ0FdDHvO519aXvZR3WZIo="
+    length="53012325"
+    type="application/octet-stream" />
+  </item>
   <item>
    <title>Version 5.29</title>
    <link>http://www.jwz.org/xscreensaver/xscreensaver-5.29.dmg</link>
     length="51332404"
     type="application/octet-stream" />
   </item>
-  <item>
-   <title>Version 5.28</title>
-   <link>http://www.jwz.org/xscreensaver/xscreensaver-5.28.dmg</link>
-   <description><![CDATA[&bull; Fixed some compilation problems and intermittent crashes. <BR>&bull; Turned off the OSX 10.6 enable_gc hack. It didn't work.]]></description>
-   <pubDate>Wed, 04 Jun 2014 13:51:27 -0700</pubDate>
-   <enclosure url="http://www.jwz.org/xscreensaver/xscreensaver-5.28.dmg"
-    sparkle:version="5.28"
-    sparkle:dsaSignature="MC0CFCic+M1r8vJdzeZ0tbsvhSlkcuOTAhUAqxQeckaXmn8TV+KJp3EsoEzMiBo="
-    length="51021639"
-    type="application/octet-stream" />
-  </item>
-  <item>
-   <title>Version 5.27</title>
-   <link>http://www.jwz.org/xscreensaver/xscreensaver-5.27.dmg</link>
-   <description><![CDATA[&bull; New hacks, `tessellimage' and `projectiveplane'. <BR>&bull; Added support for pthreads, because Dave Odell is a madman. <BR>&bull; Updated `webcollage' for recent changes. <BR>&bull; Minor iOS tweaks to the `analogtv' hacks. <BR>&bull; X11: Don't assume Suspend = 0 implies "No DPMS". <BR>&bull; Minor updates to `boxed' and `klein'. <BR>&bull; Fixed possible crash in `apple2', `noseguy', `xmatrix', `shadebobs'. <BR>&bull; Fixed possible crash in OSX preferences. <BR>&bull; OSX Performance improvements. <BR>&bull; Plugged some leaks.]]></description>
-   <pubDate>Tue, 27 May 2014 03:05:35 -0700</pubDate>
-   <enclosure url="http://www.jwz.org/xscreensaver/xscreensaver-5.27.dmg"
-    sparkle:version="5.27"
-    sparkle:dsaSignature="MC0CFQDIHH0Q0NqJ8K0XDDe8lUPpTdpLeQIUW1tdF1xsu0WviJ+EpxOXYiudetM="
-    length="50979508"
-    type="application/octet-stream" />
-  </item>
   <item>
    <title>Version 5.14</title>
    <link>http://www.jwz.org/xscreensaver/xscreensaver-5.14.dmg</link>
diff --git a/OSX/xscreensaver.xcconfig b/OSX/xscreensaver.xcconfig
new file mode 100644 (file)
index 0000000..10313cc
--- /dev/null
@@ -0,0 +1,7 @@
+// To create builds that work properly on MacOS 10.6, Xcode 5.0.2 must
+// be used, since that is the latest version that supports garbage collection.
+// If the Xcode version is 5.02 or earlier, this must be set to "-fobjc-gc".
+// If the Xcode version is newer than that, this must be blank (and the
+// builds created will not work on 10.6.)
+//
+OBJC_GC_CFLAGS=-fobjc-gc
diff --git a/README b/README
index ab7ecb52d8d555d7ba42fdf06ba64ca4686c8df4..a6184dab932d010739d9ed701c242b3233e626bc 100644 (file)
--- a/README
+++ b/README
@@ -38,6 +38,22 @@ XScreenSaver has an extensive manual -- please read it!
 
 ===============================================================================
 
+5.31   * New hacks, `geodesicgears', `binaryring' and `cityflow'.
+        * UTF-8 text support (instead of only Latin1) and antialiased text
+          on X11 with Xft (instead of only on OSX/iOS) in `fontglide',
+          `noseguy', `fliptext', `starwars', and `winduprobot'.
+          The other text-displaying hacks (`apple2', `phosphor', `xmatrix',
+          and `gltext') also now accept UTF-8 input, though they convert it
+          to Latin1 or ASCII.
+       * `glplanet' now has both day and night maps, and a sharp terminator.
+       * Fixed `webcollage' on OSX.
+       * Fixed a transparency glitch in `winduprobot'.
+       * `lockward' works on iOS.
+       * Text and image loading work on OSX 10.10.
+       * Rotation works properly on iOS 8.
+       * Added a search field on iOS.
+       * Preliminary, unfinished support for Android.
+
 5.30   * New hack, `winduprobot'.
        * Many improvements to `lament', including Leviathan.
        * Fixed the normals in `flyingtoasters': shading is correct now.
diff --git a/android/Makefile b/android/Makefile
new file mode 100644 (file)
index 0000000..2b88a62
--- /dev/null
@@ -0,0 +1,28 @@
+# XScreenSaver for Android
+
+default: all
+
+all:
+       @echo Nope. ; exit 1
+
+clean::
+
+distclean::
+
+distdepend::
+
+# Todo:
+# check_versions:
+# update_thumbs:
+
+
+# Should probably exclude "gen"
+
+echo_tarfiles:
+       @echo `find . \
+         \( \( -name '.??*' -o -name build -o -name '*~*' \) \
+            -prune \) \
+         -o \( -type f -o -type l \) -print \
+       | sed 's@^\./@@' \
+       | sort`
+
diff --git a/android/XScreenSaverGLView.c b/android/XScreenSaverGLView.c
new file mode 100644 (file)
index 0000000..6ffecd9
--- /dev/null
@@ -0,0 +1,79 @@
+#include <android/log.h>
+#include "screenhackI.h"
+#include "xlockmoreI.h"
+
+#if defined(USE_IPHONE) || (HAVE_ANDROID)
+# include "jwzgles.h"
+#else
+# include <OpenGL/OpenGL.h>
+#endif
+
+/* used by the OpenGL screen savers
+ */
+extern GLXContext *init_GL (ModeInfo *);
+extern void glXSwapBuffers (Display *, Window);
+extern void glXMakeCurrent (Display *, Window, GLXContext);
+extern void clear_gl_error (void);
+extern void check_gl_error (const char *type);
+
+/* Does nothing - prepareContext already did the work.
+ */
+void
+glXMakeCurrent (Display *dpy, Window window, GLXContext context)
+{
+}
+
+
+/* clear away any lingering error codes */
+void
+clear_gl_error (void)
+{
+  while (glGetError() != GL_NO_ERROR)
+    ;
+}
+
+
+// needs to be implemented in Android...
+/* Copy the back buffer to the front buffer.
+ */
+void
+glXSwapBuffers (Display *dpy, Window window)
+{
+}
+
+
+/* Called by OpenGL savers using the XLockmore API.
+ */
+GLXContext *
+init_GL (ModeInfo *mi)
+{
+  Window win = mi->window;
+}
+
+/* report a GL error. */
+void
+check_gl_error (const char *type)
+{
+  char buf[100];
+  GLenum i;
+  const char *e;
+  switch ((i = glGetError())) {
+    case GL_NO_ERROR: return;
+    case GL_INVALID_ENUM:          e = "invalid enum";      break;
+    case GL_INVALID_VALUE:         e = "invalid value";     break;
+    case GL_INVALID_OPERATION:     e = "invalid operation"; break;
+    case GL_STACK_OVERFLOW:        e = "stack overflow";    break;
+    case GL_STACK_UNDERFLOW:       e = "stack underflow";   break;
+    case GL_OUT_OF_MEMORY:         e = "out of memory";     break;
+#ifdef GL_TABLE_TOO_LARGE_EXT
+    case GL_TABLE_TOO_LARGE_EXT:   e = "table too large";   break;
+#endif
+#ifdef GL_TEXTURE_TOO_LARGE_EXT
+    case GL_TEXTURE_TOO_LARGE_EXT: e = "texture too large"; break;
+#endif
+    default:
+      e = buf; sprintf (buf, "unknown GL error %d", (int) i); break;
+  }
+  __android_log_write(ANDROID_LOG_ERROR, "xscreensaver", e);
+}
+
diff --git a/android/XScreenSaverView.c b/android/XScreenSaverView.c
new file mode 100644 (file)
index 0000000..08d2c4c
--- /dev/null
@@ -0,0 +1,175 @@
+#include <stdio.h>
+#include <string.h>
+#include <zlib.h>
+#include "screenhackI.h"
+#include "xlockmoreI.h"
+
+extern struct xscreensaver_function_table *xscreensaver_function_table;
+
+extern const char *progname;
+extern const char *progclass;
+int mono_p = 0;
+
+static int sproingies_count = 8;
+static double superquadrics_speed = 5.0;
+static int stonerview_delay = 20000;
+static char *hilbert_mode;
+static Bool stonerview_transparent = False;
+
+// TODO: fill in what is not here
+Bool get_boolean_resource(Display * dpy, char *name, char *class)
+{
+    Bool b;
+
+    if (strcmp(progname, "hilbert") == 0) {
+
+       if (strcmp(name, "spin") == 0 && strcmp(class, "Spin") == 0) {
+           b = True;
+       } else if (strcmp(name, "wireframe") == 0
+                  && strcmp(class, "Boolean") == 0) {
+           b = False;
+       } else if (strcmp(name, "wander") == 0
+                  && strcmp(class, "Wander") == 0) {
+           b = False;
+       }
+    } else if (strcmp(progname, "stonerview") == 0) {
+       if (strcmp(name, "use3d") == 0 && strcmp(class, "Boolean") == 0) {
+           b = True;
+       } else if (strcmp(name, "transparent") == 0
+                  && strcmp(class, "Transparent") == 0) {
+           b = stonerview_transparent;
+       } else if (strcmp(name, "wireframe") == 0
+                  && strcmp(class, "Boolean") == 0) {
+           b = False;
+       } else if (strcmp(name, "doFPS") == 0
+                  && strcmp(class, "DoFPS") == 0) {
+           b = False;
+       }
+    } else if (strcmp(progname, "superquadrics") == 0) {
+       if (strcmp(name, "wireframe") == 0
+           && strcmp(class, "Boolean") == 0) {
+           b = False;
+       }
+    } else if (strcmp(progname, "sproingies") == 0) {
+       if (strcmp(name, "wireframe") == 0
+           && strcmp(class, "Boolean") == 0) {
+           b = False;
+       }
+    }
+
+    return b;
+}
+
+// TODO: fill in what is not here
+char *get_string_resource(Display * dpy, char *name, char *class)
+{
+    char *implement;
+
+    if (strcmp(progname, "hilbert") == 0) {
+       if (strcmp(name, "mode") == 0 && strcmp(class, "Mode") == 0) {
+           implement = malloc(8 * sizeof(char));
+           strcpy(implement, hilbert_mode);
+       } else if (strcmp(name, "ends") == 0 && strcmp(class, "Ends") == 0) {
+           implement = malloc(5 * sizeof(char));
+           strcpy(implement, "open");
+       } else {
+           implement = 0;
+       }
+
+    } else {
+       implement = 0;
+    }
+
+    return implement;
+}
+
+
+// TODO: fill in what is not here
+int get_integer_resource(Display * dpy, char *name, char *class)
+{
+
+    if (strcmp(progname, "sproingies") == 0) {
+       if (strcmp(name, "count") == 0 && strcmp(class, "Int") == 0) {
+           return sproingies_count;
+       }
+    } else if (strcmp(progname, "superquadrics") == 0) {
+
+       if (strcmp(name, "count") == 0 && strcmp(class, "Int") == 0) {
+           return 25;
+       } else if (strcmp(name, "cycles") == 0
+                  && strcmp(class, "Int") == 0) {
+           return 40;
+       } else if (strcmp(name, "delay") == 0
+                  && strcmp(class, "Usecs") == 0) {
+           return 40000;
+       }
+
+    } else if (strcmp(progname, "hilbert") == 0) {
+       if (strcmp(name, "delay") == 0 && strcmp(class, "Usecs") == 0) {
+           return 30000;
+       }
+       if (strcmp(name, "maxDepth") == 0
+           && strcmp(class, "MaxDepth") == 0) {
+           // too deep is too much for less powerful Android phones
+           return 3;
+           //return 5;
+       }
+    }
+
+}
+
+
+// TODO: fill in what is not here
+double get_float_resource(Display * dpy, char *name, char *class)
+{
+
+    if (strcmp(progname, "superquadrics") == 0) {
+       if (strcmp(name, "spinspeed") == 0
+           && strcmp(class, "Spinspeed") == 0) {
+           return superquadrics_speed;
+       }
+    } else if (strcmp(progname, "hilbert") == 0) {
+       if (strcmp(name, "speed") == 0 && strcmp(class, "Speed") == 0) {
+           return 1.0;
+       } else if (strcmp(name, "thickness") == 0
+                  && strcmp(class, "Thickness") == 0) {
+           return 0.25;
+       }
+    }
+}
+
+
+void setSproingiesCount(int c)
+{
+    sproingies_count = c;
+}
+
+void setStonerviewTransparency(int c)
+{
+    if (c == 1) {
+       stonerview_transparent = True;
+    } else {
+       stonerview_transparent = False;
+    }
+}
+
+void setHilbertMode(char *mode)
+{
+    if (!hilbert_mode) {
+       hilbert_mode = malloc(8 * sizeof(char));
+    }
+    if (strcmp(mode, "3d") == 0) {
+       strcpy(hilbert_mode, "3d");
+    }
+    if (strcmp(mode, "2d") == 0) {
+       strcpy(hilbert_mode, "2d");
+    } else {
+       strcpy(hilbert_mode, "random");
+    }
+}
+
+
+void setSuperquadricsSpeed(double sq_speed)
+{
+    superquadrics_speed = sq_speed;
+}
diff --git a/android/glue.c b/android/glue.c
new file mode 100644 (file)
index 0000000..ebcadb1
--- /dev/null
@@ -0,0 +1,323 @@
+#include <jni.h>
+#include <math.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+#include <pthread.h>
+#include <GLES/gl.h>
+
+#include "screenhackI.h"
+#include "jwzglesI.h"
+#include "version.h"
+
+#undef PI
+#define PI 3.1415926535897932f
+
+void drawXscreensaver();
+
+int sWindowWidth = 0;
+int sWindowHeight = 0;
+int initTried = 0;
+int renderTried = 0;
+int resetTried = 0;
+int currentFlip = 0;
+
+pthread_mutex_t mutg = PTHREAD_MUTEX_INITIALIZER;
+
+extern struct xscreensaver_function_table *xscreensaver_function_table;
+
+// if adding a table here, increase the magic number
+struct xscreensaver_function_table
+*hypertorus_xscreensaver_function_table,
+    *hilbert_xscreensaver_function_table,
+    *endgame_xscreensaver_function_table,
+    *stonerview_xscreensaver_function_table,
+    *sproingies_xscreensaver_function_table,
+    *blinkbox_xscreensaver_function_table,
+    *flipflop_xscreensaver_function_table,
+    *superquadrics_xscreensaver_function_table;
+
+
+Bool mono_p;
+
+
+static XrmOptionDescRec default_options[] = {
+    {"-root", ".root", XrmoptionNoArg, "True"},
+    {"-window", ".root", XrmoptionNoArg, "False"},
+    {"-mono", ".mono", XrmoptionNoArg, "True"},
+    {"-install", ".installColormap", XrmoptionNoArg, "True"},
+    {"-noinstall", ".installColormap", XrmoptionNoArg, "False"},
+    {"-visual", ".visualID", XrmoptionSepArg, 0},
+    {"-window-id", ".windowID", XrmoptionSepArg, 0},
+    {"-fps", ".doFPS", XrmoptionNoArg, "True"},
+    {"-no-fps", ".doFPS", XrmoptionNoArg, "False"},
+
+#ifdef DEBUG_PAIR
+    {"-pair", ".pair", XrmoptionNoArg, "True"},
+#endif                         /* DEBUG_PAIR */
+    {0, 0, 0, 0}
+};
+
+static char *default_defaults[] = {
+    ".root:               false",
+    "*geometry:           600x480",    /* this should be .geometry, but nooooo... */
+    "*mono:               false",
+    "*installColormap:    false",
+    "*doFPS:              false",
+    "*multiSample:        false",
+    "*visualID:           default",
+    "*windowID:           ",
+    "*desktopGrabber:     xscreensaver-getimage %s",
+    0
+};
+
+static XrmOptionDescRec *merged_options;
+static int merged_options_size;
+static char **merged_defaults;
+
+
+struct running_hack {
+    struct xscreensaver_function_table *xsft;
+    Display *dpy;
+    Window window;
+    void *closure;
+};
+
+const char *progname;
+const char *progclass;
+
+
+struct running_hack rh[8];
+// ^ magic number of hacks - TODO: remove magic number
+
+
+
+int chosen;
+// 0 superquadrics
+// 1 stonerview
+// 2 sproingies
+// 3 hilbert
+
+JNIEXPORT void JNICALL
+    Java_org_jwz_xscreensaver_CallNative_nativeInit
+    (JNIEnv * env);
+JNIEXPORT void JNICALL
+    Java_org_jwz_xscreensaver_CallNative_nativeResize
+    (JNIEnv * env, jobject thiz, jint w, jint h);
+JNIEXPORT void JNICALL
+    Java_org_jwz_xscreensaver_CallNative_nativeRender
+    (JNIEnv * env);
+JNIEXPORT void JNICALL
+    Java_org_jwz_xscreensaver_CallNative_nativeDone
+    (JNIEnv * env);
+JNIEXPORT void JNICALL
+    Java_org_jwz_xscreensaver_gen_SuperquadricsWallpaper_nativeSettings
+    (JNIEnv * env, jobject thiz, jstring jhack, jstring hackPref,
+     jint draw);
+JNIEXPORT void JNICALL
+    Java_org_jwz_xscreensaver_gen_StonerviewWallpaper_nativeSettings
+    (JNIEnv * env, jobject thiz, jstring jhack, jstring hackPref,
+     jint draw);
+JNIEXPORT void JNICALL
+    Java_org_jwz_xscreensaver_gen_SproingiesWallpaper_nativeSettings
+    (JNIEnv * env, jobject thiz, jstring jhack, jstring hackPref,
+     jint draw);
+JNIEXPORT void JNICALL
+    Java_org_jwz_xscreensaver_gen_HilbertWallpaper_nativeSettings
+    (JNIEnv * env, jobject thiz, jstring jhack, jstring hackPref,
+     jint draw);
+
+void doinit()
+{
+
+
+    if (chosen == 0) {
+       progname = "superquadrics";
+       rh[chosen].xsft = &superquadrics_xscreensaver_function_table;
+       //progname = "blinkbox";
+       //rh[chosen].xsft = &blinkbox_xscreensaver_function_table;
+       //progname = "flipflop";
+       //rh[chosen].xsft = &flipflop_xscreensaver_function_table;
+       //progname = "hypertorus";
+       //rh[chosen].xsft = &hypertorus_xscreensaver_function_table;
+    } else if (chosen == 1) {
+       progname = "stonerview";
+       rh[chosen].xsft = &stonerview_xscreensaver_function_table;
+
+    } else if (chosen == 2) {
+       progname = "sproingies";
+       rh[chosen].xsft = &sproingies_xscreensaver_function_table;
+
+    } else if (chosen == 3) {
+       progname = "hilbert";
+       rh[chosen].xsft = &hilbert_xscreensaver_function_table;
+    } else {
+       progname = "sproingies";
+       rh[chosen].xsft = &sproingies_xscreensaver_function_table;
+    }
+
+    rh[chosen].dpy = jwxyz_make_display(0, 0);
+    rh[chosen].window = XRootWindow(rh[chosen].dpy, 0);
+// TODO: Zero looks right, but double-check that is the right number
+
+    progclass = rh[chosen].xsft->progclass;
+
+    if (rh[chosen].xsft->setup_cb)
+       rh[chosen].xsft->setup_cb(rh[chosen].xsft,
+                                 rh[chosen].xsft->setup_arg);
+
+    if (resetTried < 1) {
+       resetTried++;
+        jwzgles_reset();
+    }
+
+    void *(*init_cb) (Display *, Window, void *) =
+       (void *(*)(Display *, Window, void *)) rh[chosen].xsft->init_cb;
+
+    rh[chosen].closure =
+       init_cb(rh[chosen].dpy, rh[chosen].window,
+               rh[chosen].xsft->setup_arg);
+
+}
+
+
+JNIEXPORT void JNICALL
+    Java_org_jwz_xscreensaver_CallNative_nativeInit
+    (JNIEnv * env) {
+
+    if (initTried < 1) {
+       initTried++;
+    } else {
+       if (!rh[chosen].dpy) {
+           doinit();
+       } else {
+           rh[chosen].xsft->free_cb(rh[chosen].dpy, rh[chosen].window,
+                                    rh[chosen].closure);
+           jwxyz_free_display(rh[chosen].dpy);
+           rh[chosen].dpy = NULL;
+           rh[chosen].window = NULL;
+           if (!rh[chosen].dpy) {
+               doinit();
+           }
+
+       }
+    }
+
+}
+
+
+JNIEXPORT void JNICALL
+    Java_org_jwz_xscreensaver_CallNative_nativeResize
+    (JNIEnv * env, jobject thiz, jint w, jint h) {
+
+    sWindowWidth = w;
+    sWindowHeight = h;
+
+    if (!rh[chosen].dpy) {
+       doinit();
+    }
+
+    jwxyz_window_resized(rh[chosen].dpy, rh[chosen].window, 0, 0, w, h, 0);
+
+    rh[chosen].xsft->reshape_cb(rh[chosen].dpy, rh[chosen].window,
+                               rh[chosen].closure, w, h);
+}
+
+JNIEXPORT void JNICALL
+    Java_org_jwz_xscreensaver_CallNative_nativeRender
+    (JNIEnv * env) {
+    if (renderTried < 1) {
+       renderTried++;
+    } else {
+       drawXscreensaver();
+    }
+}
+
+// TODO: Check Java side is calling this properly
+JNIEXPORT void JNICALL
+    Java_org_jwz_xscreensaver_CallNative_nativeDone
+    (JNIEnv * env) {
+
+    rh[chosen].xsft->free_cb(rh[chosen].dpy, rh[chosen].window,
+                            rh[chosen].closure);
+    jwxyz_free_display(rh[chosen].dpy);
+    rh[chosen].dpy = NULL;
+    rh[chosen].window = NULL;
+
+}
+
+JNIEXPORT void JNICALL
+    Java_org_jwz_xscreensaver_gen_SuperquadricsWallpaper_nativeSettings
+    (JNIEnv * env, jobject thiz, jstring jhack, jstring hackPref,
+     jint draw) {
+
+    double sq_speed;
+    const char *chack = (*env)->GetStringUTFChars(env, hackPref, NULL);
+    char *hck = (char *) chack;
+
+    if (draw == 0) {
+
+       double sqd;
+       sq_speed = sscanf(hck, "%lf", &sqd);
+       setSuperquadricsSpeed(sqd);
+    }
+
+    chosen = 0;
+}
+
+JNIEXPORT void JNICALL
+    Java_org_jwz_xscreensaver_gen_StonerviewWallpaper_nativeSettings
+    (JNIEnv * env, jobject thiz, jstring jhack, jstring hackPref,
+     jint draw) {
+
+    int count;
+    const char *chack = (*env)->GetStringUTFChars(env, hackPref, NULL);
+    char *hck = (char *) chack;
+    count = atoi(hck);
+    if (draw == 0) {
+       setStonerviewTransparency(count);
+    }
+
+    chosen = 1;
+}
+
+
+
+JNIEXPORT void JNICALL
+    Java_org_jwz_xscreensaver_gen_SproingiesWallpaper_nativeSettings
+    (JNIEnv * env, jobject thiz, jstring jhack, jstring hackPref,
+     jint draw) {
+
+    int count;
+    const char *chack = (*env)->GetStringUTFChars(env, hackPref, NULL);
+    char *hck = (char *) chack;
+    count = atoi(hck);
+    if (draw == 0) {
+       setSproingiesCount(count);
+    }
+
+    chosen = 2;
+}
+
+JNIEXPORT void JNICALL
+    Java_org_jwz_xscreensaver_gen_HilbertWallpaper_nativeSettings
+    (JNIEnv * env, jobject thiz, jstring jhack, jstring hackPref,
+     jint draw) {
+    const char *chack = (*env)->GetStringUTFChars(env, hackPref, NULL);
+    char *hck = (char *) chack;
+    if (draw == 0) {
+       setHilbertMode(hck);
+    }
+    chosen = 3;
+}
+
+
+
+void drawXscreensaver()
+{
+    pthread_mutex_lock(&mutg);
+    rh[chosen].xsft->draw_cb(rh[chosen].dpy, rh[chosen].window,
+                            rh[chosen].closure);
+    pthread_mutex_unlock(&mutg);
+
+}
diff --git a/android/jwxyz-timers.h b/android/jwxyz-timers.h
new file mode 100644 (file)
index 0000000..472cdf9
--- /dev/null
@@ -0,0 +1,28 @@
+/* xscreensaver, Copyright (c) 2006-2012 Jamie Zawinski <jwz@jwz.org>
+ *
+ * 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 an implementation of Xt timers, for libjwxyz.
+ */
+
+#ifndef __JWXYZ_TIMERS_H__
+#define __JWXYZ_TIMERS_H__
+
+#include "jwxyz.h"
+
+typedef struct jwxyz_sources_data jwxyz_sources_data;
+
+extern jwxyz_sources_data *jwxyz_sources_init (XtAppContext);
+extern void jwxyz_sources_free (jwxyz_sources_data *);
+extern void jwxyz_sources_run (jwxyz_sources_data *);
+
+extern void jwxyz_XtRemoveInput_all (Display *);
+
+#endif /* __JWXYZ_TIMERS_H__ */
diff --git a/android/jwxyz.c b/android/jwxyz.c
new file mode 100644 (file)
index 0000000..b7964a6
--- /dev/null
@@ -0,0 +1,432 @@
+/* xscreensaver, Copyright (c) 1991-2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * 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.
+ */
+
+/* JWXYZ Is Not Xlib.
+
+   But it's a bunch of function definitions that bear some resemblance to
+   Xlib and that do things that bear some resemblance to the
+   things that Xlib might have done.
+ */
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <wchar.h>
+#include <android/log.h>
+
+#include "jwxyz.h"
+#include "jwxyz-timers.h"
+#include "yarandom.h"
+#include "screenhackI.h"
+
+typedef signed char BOOL;
+#define YES             (BOOL)1
+#define NO              (BOOL)0
+
+struct CGPoint {
+    float x;
+    float y;
+};
+typedef struct CGPoint CGPoint;
+
+struct CGSize {
+    float width;
+    float height;
+};
+typedef struct CGSize CGSize;
+
+struct CGRect {
+    CGPoint origin;
+    CGSize size;
+};
+typedef struct CGRect CGRect;
+
+struct jwxyz_Drawable {
+    enum { WINDOW, PIXMAP } type;
+    CGRect frame;
+    union {
+       struct {
+           unsigned long background;
+           int last_mouse_x, last_mouse_y;
+       } window;
+       struct {
+           int depth;
+           void *cgc_buffer;   
+       } pixmap;
+    };
+};
+
+struct jwxyz_Display {
+    Window main_window;
+    Screen *screen;
+    int screen_count;
+    struct jwxyz_sources_data *timers_data;
+};
+
+struct jwxyz_Screen {
+    Display *dpy;
+    Visual *visual;
+    int screen_number;
+};
+
+
+static void draw_rect(Display *, Drawable, GC,
+                     int x, int y, unsigned int width,
+                     unsigned int height, BOOL foreground_p, BOOL fill_p);
+
+Status
+XParseColor(Display * dpy, Colormap cmap, const char *spec, XColor * ret)
+{
+    unsigned char r = 0, g = 0, b = 0;
+    if (*spec == '#' && strlen(spec) == 7) {
+       static unsigned const char hex[] = {    // yeah yeah, shoot me.
+           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4,
+               5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0,
+           0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+           0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+       };
+       r = (hex[spec[1]] << 4) | hex[spec[2]];
+       g = (hex[spec[3]] << 4) | hex[spec[4]];
+       b = (hex[spec[5]] << 4) | hex[spec[6]];
+    } else if (!strcasecmp(spec, "black")) {
+//  r = g = b = 0;
+    } else if (!strcasecmp(spec, "white")) {
+       r = g = b = 255;
+    } else if (!strcasecmp(spec, "red")) {
+       r = 255;
+    } else if (!strcasecmp(spec, "green")) {
+       g = 255;
+    } else if (!strcasecmp(spec, "blue")) {
+       b = 255;
+    } else if (!strcasecmp(spec, "cyan")) {
+       g = b = 255;
+    } else if (!strcasecmp(spec, "magenta")) {
+       r = b = 255;
+    } else if (!strcasecmp(spec, "yellow")) {
+       r = g = 255;
+    } else {
+       return 0;
+    }
+
+    ret->red = (r << 8) | r;
+    ret->green = (g << 8) | g;
+    ret->blue = (b << 8) | b;
+    ret->flags = DoRed | DoGreen | DoBlue;
+    return 1;
+}
+
+Status XAllocColor(Display * dpy, Colormap cmap, XColor * color)
+{
+    // store 32 bit ARGB in the pixel field.
+    // (The uint32_t is so that 0xFF000000 doesn't become 0xFFFFFFFFFF000000)
+    color->pixel = (uint32_t)
+       ((0xFF << 24) |
+        (((color->red >> 8) & 0xFF) << 16) |
+        (((color->green >> 8) & 0xFF) << 8) |
+        (((color->blue >> 8) & 0xFF)));
+    return 1;
+}
+
+//  needs to be implemented in Android...
+int
+XFillRectangle(Display * dpy, Drawable d, GC gc, int x, int y,
+              unsigned int width, unsigned int height)
+{
+    return 0;
+}
+
+//  needs to be implemented in Android...
+int
+XDrawString(Display * dpy, Drawable d, GC gc, int x, int y,
+           const char *str, int len)
+{
+    return 0;                  // try this for now...
+}
+
+
+//  needs to be implemented in Android...
+int XFreeGC(Display * dpy, GC gc)
+{
+    return 0;
+}
+
+
+
+int XFreeFont(Display * dpy, XFontStruct * f)
+{
+    return 0;
+}
+
+int XFreeFontInfo(char **names, XFontStruct * info, int n)
+{
+    int i;
+    if (names) {
+       for (i = 0; i < n; i++)
+           if (names[i])
+               free(names[i]);
+       free(names);
+    }
+    if (info) {
+       for (i = 0; i < n; i++)
+           if (info[i].per_char)
+               free(info[i].per_char);
+       free(info);
+    }
+    return 0;
+}
+
+
+//  needs to be implemented in Android...
+int XUnloadFont(Display * dpy, Font fid)
+{
+    return 0;
+}
+
+
+//  needs to be implemented in Android...
+GC
+XCreateGC(Display * dpy, Drawable d, unsigned long mask, XGCValues * xgcv)
+{
+}
+
+
+//  needs to be implemented in Android...
+XFontStruct *XLoadQueryFont(Display * dpy, const char *name)
+{
+}
+
+
+Status
+XGetWindowAttributes(Display * dpy, Window w, XWindowAttributes * xgwa)
+{
+
+//  Assert (w && w->type == WINDOW, "not a window");
+
+    memset(xgwa, 0, sizeof(*xgwa));
+    xgwa->x = w->frame.origin.x;
+    xgwa->y = w->frame.origin.y;
+    xgwa->width = w->frame.size.width;
+    xgwa->height = w->frame.size.height;
+    xgwa->depth = 32;
+    xgwa->screen = dpy->screen;
+    xgwa->visual = dpy->screen->visual;
+
+    return 0;
+}
+
+//  needs to be implemented in Android...
+int XSetFont(Display * dpy, GC gc, Font fid)
+{
+    return 0;
+}
+
+
+//  needs to be implemented in Android...
+int XClearWindow(Display * dpy, Window win)
+{
+}
+
+// declared in utils/visual.h
+int has_writable_cells(Screen * s, Visual * v)
+{
+    return 0;
+}
+
+Status
+XAllocColorCells(Display * dpy, Colormap cmap, Bool contig,
+                unsigned long *pmret, unsigned int npl,
+                unsigned long *pxret, unsigned int npx)
+{
+    return 0;
+}
+
+int XStoreColors(Display * dpy, Colormap cmap, XColor * colors, int n)
+{
+    //Assert(0, "XStoreColors called");
+    return 0;
+}
+
+int
+XFreeColors(Display * dpy, Colormap cmap, unsigned long *px, int npixels,
+           unsigned long planes)
+{
+    return 0;
+}
+
+int XFlush(Display * dpy)
+{
+    return 0;
+}
+
+Display *XDisplayOfScreen(Screen * s)
+{
+    return s->dpy;
+}
+
+//  needs to be implemented in Android...
+int
+XLookupString(XKeyEvent * e, char *buf, int size, KeySym * k_ret,
+             XComposeStatus * xc)
+{
+    return 0;
+}
+
+int XScreenNumberOfScreen(Screen * s)
+{
+    return s->screen_number;
+}
+
+int jwxyz_ScreenCount(Display * dpy)
+{
+    return dpy->screen_count;
+}
+
+
+/*
+// should this be defined?
+static Display *jwxyz_live_displays[20] = { 0, };
+*/
+
+Display * jwxyz_make_display (void *nsview_arg, void *cgc_arg)
+{
+    Display *d = (Display *) calloc(1, sizeof(*d));
+    d->screen = (Screen *) calloc(1, sizeof(Screen));
+    d->screen->dpy = d;
+
+    d->screen_count = 1;
+    d->screen->screen_number = 0;
+
+    Visual *v = (Visual *) calloc(1, sizeof(Visual));
+    v->class = TrueColor;
+    v->red_mask = 0x00FF0000;
+    v->green_mask = 0x0000FF00;
+    v->blue_mask = 0x000000FF;
+    v->bits_per_rgb = 8;
+    d->screen->visual = v;
+
+    Window w = (Window) calloc(1, sizeof(*w));
+    w->type = WINDOW;
+    w->window.background = BlackPixel(0, 0);
+
+    d->main_window = w;
+
+    return d;
+}
+
+void
+jwxyz_free_display (Display *dpy)
+{
+  free (dpy->screen->visual);
+  free (dpy->screen);
+  free (dpy->main_window);
+  free (dpy);
+}
+
+
+/* Call this when the Renderer calls onSurfaceChanged
+ */
+void
+jwxyz_window_resized (Display *dpy, Window w, 
+                      int new_x, int new_y, int new_width, int new_height,
+                      void *cgc_arg)
+{
+    w->frame.origin.x = new_x;
+    w->frame.origin.y = new_y;
+    w->frame.size.width = new_width;
+    w->frame.size.height = new_height;
+}
+
+Window XRootWindow(Display * dpy, int screen)
+{
+    return dpy->main_window;
+}
+
+/* Handle an abort on Android
+   TODO: Test that Android handles aborts properly
+ */
+void
+jwxyz_abort (const char *fmt, ...)
+{
+  char s[10240];
+  if (!fmt || !*fmt)
+    strcpy (s, "abort");
+  else
+    {
+      va_list args;
+      va_start (args, fmt);
+      vsprintf (s, fmt, args);
+      va_end (args);
+    }
+  /* Send error to Android device log */
+  __android_log_write(ANDROID_LOG_ERROR, "xscreensaver", s);
+
+  abort();  
+}
+
+Pixmap
+XCreatePixmap (Display *dpy, Drawable d,
+               unsigned int width, unsigned int height, unsigned int depth)
+{
+}
+
+int
+XDestroyImage (XImage *ximage)
+{
+  if (ximage->data) free (ximage->data);
+  free (ximage);
+  return 0;
+}
+
+int
+XDrawString16 (Display *dpy, Drawable d, GC gc, int x, int y,
+             const XChar2b *str, int len)
+{
+}
+
+int
+XFreePixmap (Display *d, Pixmap p)
+{
+}
+
+XImage *
+XGetImage (Display *dpy, Drawable d, int x, int y,
+           unsigned int width, unsigned int height,
+           unsigned long plane_mask, int format)
+{
+}
+
+unsigned long
+XGetPixel (XImage *ximage, int x, int y)
+{
+}
+
+int
+XSetForeground (Display *dpy, GC gc, unsigned long fg)
+{
+}
+
+int
+XTextExtents16 (XFontStruct *f, const XChar2b *s, int length,
+                int *dir_ret, int *ascent_ret, int *descent_ret,
+                XCharStruct *cs)
+{
+}
diff --git a/android/jwxyz.h b/android/jwxyz.h
new file mode 100644 (file)
index 0000000..2f4d59d
--- /dev/null
@@ -0,0 +1,4 @@
+/* Android does not have __dead2 defined
+   TODO: Test Android ability to abort properly */
+#define __dead2
+#include "../OSX/jwxyz.h"
diff --git a/android/project/GLWallpaperService/AndroidManifest.xml b/android/project/GLWallpaperService/AndroidManifest.xml
new file mode 100644 (file)
index 0000000..43c2085
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+      package="net.rbgrn.android.glwallpaperservice"
+      android:versionCode="1"
+      android:versionName="1.0">
+    <application android:icon="@drawable/icon" android:label="@string/app_name">
+
+
+    </application>
+    <uses-sdk android:minSdkVersion="7" />
+
+</manifest> 
\ No newline at end of file
diff --git a/android/project/GLWallpaperService/LICENSE b/android/project/GLWallpaperService/LICENSE
new file mode 100644 (file)
index 0000000..d645695
--- /dev/null
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/android/project/GLWallpaperService/NOTICE b/android/project/GLWallpaperService/NOTICE
new file mode 100644 (file)
index 0000000..117f024
--- /dev/null
@@ -0,0 +1,21 @@
+Copyright 2008 The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+Portions of this software were developed by Robert Green. The original
+software is available from
+     http://www.rbgrn.net/content/354-glsurfaceview-adapted-3d-live-wallpapers
+
+Other contributors include
+     Mark Guerra - http://www.markguerra.net
+     TaDaa - https://github.com/TaDaa
diff --git a/android/project/GLWallpaperService/build.xml b/android/project/GLWallpaperService/build.xml
new file mode 100644 (file)
index 0000000..b75ecc9
--- /dev/null
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="GLWallpaperService" default="help">
+
+    <!-- The local.properties file is created and updated by the 'android' tool.
+         It contains the path to the SDK. It should *NOT* be checked into
+         Version Control Systems. -->
+    <property file="local.properties" />
+
+    <!-- The ant.properties file can be created by you. It is only edited by the
+         'android' tool to add properties to it.
+         This is the place to change some Ant specific build properties.
+         Here are some properties you may want to change/update:
+
+         source.dir
+             The name of the source directory. Default is 'src'.
+         out.dir
+             The name of the output directory. Default is 'bin'.
+
+         For other overridable properties, look at the beginning of the rules
+         files in the SDK, at tools/ant/build.xml
+
+         Properties related to the SDK location or the project target should
+         be updated using the 'android' tool with the 'update' action.
+
+         This file is an integral part of the build system for your
+         application and should be checked into Version Control Systems.
+
+         -->
+    <property file="ant.properties" />
+
+    <!-- if sdk.dir was not set from one of the property file, then
+         get it from the ANDROID_HOME env var.
+         This must be done before we load project.properties since
+         the proguard config can use sdk.dir -->
+    <property environment="env" />
+    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
+        <isset property="env.ANDROID_HOME" />
+    </condition>
+
+    <!-- The project.properties file is created and updated by the 'android'
+         tool, as well as ADT.
+
+         This contains project specific properties such as project target, and library
+         dependencies. Lower level build properties are stored in ant.properties
+         (or in .classpath for Eclipse projects).
+
+         This file is an integral part of the build system for your
+         application and should be checked into Version Control Systems. -->
+    <loadproperties srcFile="project.properties" />
+
+    <!-- quick check on sdk.dir -->
+    <fail
+            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
+            unless="sdk.dir"
+    />
+
+    <!--
+        Import per project custom build rules if present at the root of the project.
+        This is the place to put custom intermediary targets such as:
+            -pre-build
+            -pre-compile
+            -post-compile (This is typically used for code obfuscation.
+                           Compiled code location: ${out.classes.absolute.dir}
+                           If this is not done in place, override ${out.dex.input.absolute.dir})
+            -post-package
+            -post-build
+            -pre-clean
+    -->
+    <import file="custom_rules.xml" optional="true" />
+
+    <!-- Import the actual build file.
+
+         To customize existing targets, there are two options:
+         - Customize only one target:
+             - copy/paste the target into this file, *before* the
+               <import> task.
+             - customize it to your needs.
+         - Customize the whole content of build.xml
+             - copy/paste the content of the rules files (minus the top node)
+               into this file, replacing the <import> task.
+             - customize to your needs.
+
+         ***********************
+         ****** IMPORTANT ******
+         ***********************
+         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
+         in order to avoid having your file be overridden by tools such as "android update project"
+    -->
+    <!-- version-tag: 1 -->
+    <import file="${sdk.dir}/tools/ant/build.xml" />
+
+</project>
diff --git a/android/project/GLWallpaperService/default.properties b/android/project/GLWallpaperService/default.properties
new file mode 100644 (file)
index 0000000..4eaf136
--- /dev/null
@@ -0,0 +1,12 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+# 
+# This file must be checked in Version Control Systems.
+# 
+# To customize properties used by the Ant build system use,
+# "build.properties", and override values to adapt the script to your
+# project structure.
+
+# Project target.
+target=android-7
+android.library=true
diff --git a/android/project/GLWallpaperService/local.properties b/android/project/GLWallpaperService/local.properties
new file mode 100644 (file)
index 0000000..0f7a802
--- /dev/null
@@ -0,0 +1,10 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must *NOT* be checked into Version Control Systems,
+# as it contains information specific to your local configuration.
+
+# location of the SDK. This is only used by Ant
+# For customization when using a Version Control System, please read the
+# header note.
+sdk.dir=/home/dws/dev/android-sdks
diff --git a/android/project/GLWallpaperService/project.properties b/android/project/GLWallpaperService/project.properties
new file mode 100644 (file)
index 0000000..0eb624c
--- /dev/null
@@ -0,0 +1,15 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system edit
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+#
+# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
+#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
+
+android.library=true
+# Project target.
+target=android-7
diff --git a/android/project/GLWallpaperService/readme-contribute.txt b/android/project/GLWallpaperService/readme-contribute.txt
new file mode 100644 (file)
index 0000000..d04a0ab
--- /dev/null
@@ -0,0 +1,127 @@
+Project Setup - GLWallpaperService
+==================================
+
+Discussion Group:
+http://groups.google.com/group/glwallpaperservice
+
+Repository:
+https://github.com/markfguerra/GLWallpaperService/
+
+Intended Audience
+-----------------
+This document is for developers who want to improve GLWallpaperService. It shows you how to download the source code to to improve it (or break it) as you please using Eclipse.
+If you're only interested in using the software to make an OpenGL Wallpaper, this isn't for you. Instead, look at readme.txt for info on how to get and install the Jar.
+
+
+Install required software
+-------------------------
+To start, make sure install Eclipse the latest Android SDK are installed. Optionally, install git. Follow the instructions provided by those software projects to do so.
+    Eclipse:     http://wiki.eclipse.org/FAQ_Where_do_I_get_and_install_Eclipse%3F
+    Android SDK: http://developer.android.com/sdk/installing.html
+       Git:         http://git-scm.com/
+
+Also, if you plan on using git, we recommend you make an account on github.
+       http://github.com/
+
+
+Folder Setup
+------------
+We are going to make two folders in this document. One will contain the code itself, and another will contain the Eclipse workspace. If you prefer that they both be in the same folder, do so. As if I could stop you ;)
+
+Go to where you're putting all this stuff.
+    cd /path/to/your/folder
+
+Make a folder for your workspace.
+    mkdir workspace
+
+
+Get the code
+------------
+Download the source code. You can do so using git or just a regular old download.
+
+For a direct download, go here. Extract the zip into a sub folder:
+    https://github.com/markfguerra/GLWallpaperService/zipball/master
+
+If you use github, please fork this code from their web interface:
+    https://github.com/markfguerra/GLWallpaperService
+
+Then you want to make a local clone of your github fork. Github will provide you with your own Url. My clone command looks like this:
+    git clone git@github.com:markfguerra/GLWallpaperService.git
+
+A new folder will be created automatically, called GLWallpaperService/ containing your source code.
+
+Visit this link if you need help using github:
+    http://help.github.com/
+
+
+Start Eclipse
+-------------
+Open Eclipse and choose the folder you just created for your workspace. When it finishes loading, click the Arrow to go to the workbench.
+
+
+Set up the Android SDK
+----------------------
+To set up the Android SDK for this project:
+In the menu, go to Eclipse->Preferences. Go to the Android section.
+Give it the location of your Android SDK folder. Give it a minute to figure things out.
+Select Android 2.1 (Api level 7) then click Ok.
+
+
+Import the code into the workspace
+----------------------------------
+In the Eclipse menu, choose File->New->"Android Project"
+Choose "Create new project from existing source"
+For the location click browse and select the "GLWallpaperService" folder. To be clear, this is a sub-folder of the folder that contains the LICENSE file.
+Select "Android 2.1-update1" as your build target. This is API Level 7.
+For the Project Name, type "GLWallpaperService"
+Repeat these steps for the "GLWallpaperTest" folder. Use the project name "GLWallpaperTest"
+
+The code will now be in your workspace.
+
+
+Resolving build errors
+----------------------
+Most people should have a working project at this point. However, some folks encounter build errors when they first import the code into their workspace. There are a couple of tricks to help you fix them.
+First and foremost, make sure you have the latest versions of the Android SDK and Eclipse plugin. This is important, because older versions of the developer tools handle Library Projects differently, so if you have an old version this may cause problems.
+You may have to fix the Project Properties. Right-click on the "GLWallpaperService" project in the Package Explorer. Select "Android Tools"->"Fix Project Properties".
+Also fix the project properties for "GLWallpaperTest" the same way.
+In the menu, click on Project->Clean to clean all projects.
+In Package Explorer, right-click on the GLWallpaperService project and click on "Refresh". Do the same for GLWallpaperTest.
+You may need to click on Project->Clean to clean all projects again after the refresh.
+Your errors should go away at this point. If not, try using a programming Q&A site such as stackoverflow.com and also search Google.
+
+
+To Run
+------
+Save your work. By default, saving will also compile your code in Eclipse.
+
+Plug in your Android Device to your computer, if you have one. If you don't plug in an Android device, the emulator will launch when you run the code. You may need create an Android Emulator if you havn't done so already.
+
+In the Menu, choose Run->"Run Configurations".
+Choose "Android Application"
+Click on the "New" button. This is the button with the plus sign on it.
+The name of the run configuration is New_configuration. Change it if you like.
+Click "Browse..." to choose a project. Select GLWallpaperTest. This is a sample wallpaper that comes with the code.
+Click Apply. Click Run.
+The wallpaper will now install on your device or emulator. Use the regular Android live wallpaper picker to select "GL Wallpaper Test Project". You should see a 3D rotating cube.
+
+Now that your run configuration is set up, you can run New_configuration any time by using the Toolbar icon.
+
+
+Creating GLWallpaperService.jar
+-------------------------------
+Do the following to create the JAR file, which is convenient for use in projects.
+In the Eclipse menu, click File -> Export
+Choose "JAR File"
+On the "JAR Export" screen, choose only GLWallpaperService.java. You do not need to include other files.
+Make note of where the JAR will be saved and click Finish
+
+
+Contribute your code
+--------------------
+If you do something cool with this software, we would love it if you would share your changes with us. Even if your changes still need some polishing. Don't worry, we're friendly :)
+
+If you are using git and github, push your changes to your fork and send us a pull request. If you're not using those fancy things, we want to hear from you anyway. Send us a message and we'll work something out.
+
+Thanks for your interest in this project. Good luck coding!
+
diff --git a/android/project/GLWallpaperService/readme.txt b/android/project/GLWallpaperService/readme.txt
new file mode 100644 (file)
index 0000000..3b6380d
--- /dev/null
@@ -0,0 +1,41 @@
+Truly Excellent Live Wallpaper - Version 0.1
+
+
+Upstream codebases
+------------------
+
+This is a port of Xscreensaver 5.29 to Android.
+
+On the Android side, it uses Ben Gruver's version of Mark Guerra's GL 
+WallpaperService for Android.
+
+Xscreensaver's GLX hacks are OpenGL, and Android is OpenGL ES, 
+so we use the OpenGL to OpenGL ES translation shim that is in Xscreensaver.
+
+
+Compiling
+---------
+
+We are compiling our APK with ant.  If you have a problem getting this 
+to work with Eclipse, Android Studio, or some other IDE, let us know.  
+TrulyCreative is the Service, and GLWallpaperService is the library 
+which TrulyCreative uses.  Also don't forget this uses C/C++ code via 
+the NDK, so you have to build both the C/C++ and Java/Dalvik code.
+
+
+
+Licenses
+--------
+
+Some code in gl1.c is based off code from
+Jetro Lauha's San Angeles Observation project
+which is under a BSD-style license.
+
+GLWallpaperService is under an Apache License, Version 2.0.
+
+Look in the TrulyExcellent/jni/xscreensaver to see what licenses are used.
+MIT/X11 seems to be the primary license.
+
+The rest of the code is released under Apache License, Version 2.0.  
+Some of that code is from the Android Open Source Project, some is from 
+Dennis Sheil.  Dennis Sheil dual-licenses his code as MIT/X11 license also.
diff --git a/android/project/GLWallpaperService/res/drawable-hdpi/icon.png b/android/project/GLWallpaperService/res/drawable-hdpi/icon.png
new file mode 100644 (file)
index 0000000..8074c4c
Binary files /dev/null and b/android/project/GLWallpaperService/res/drawable-hdpi/icon.png differ
diff --git a/android/project/GLWallpaperService/res/drawable-ldpi/icon.png b/android/project/GLWallpaperService/res/drawable-ldpi/icon.png
new file mode 100644 (file)
index 0000000..1095584
Binary files /dev/null and b/android/project/GLWallpaperService/res/drawable-ldpi/icon.png differ
diff --git a/android/project/GLWallpaperService/res/drawable-mdpi/icon.png b/android/project/GLWallpaperService/res/drawable-mdpi/icon.png
new file mode 100644 (file)
index 0000000..a07c69f
Binary files /dev/null and b/android/project/GLWallpaperService/res/drawable-mdpi/icon.png differ
diff --git a/android/project/GLWallpaperService/res/layout/main.xml b/android/project/GLWallpaperService/res/layout/main.xml
new file mode 100644 (file)
index 0000000..3a5f117
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    >
+<TextView  
+    android:layout_width="fill_parent" 
+    android:layout_height="wrap_content" 
+    android:text="@string/hello"
+    />
+</LinearLayout>
diff --git a/android/project/GLWallpaperService/res/values/strings.xml b/android/project/GLWallpaperService/res/values/strings.xml
new file mode 100644 (file)
index 0000000..c67ae51
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="hello">Hello World!</string>
+    <string name="app_name">GL Wallpaper Service</string>
+</resources>
diff --git a/android/project/GLWallpaperService/src/net/rbgrn/android/glwallpaperservice/GLWallpaperService.java b/android/project/GLWallpaperService/src/net/rbgrn/android/glwallpaperservice/GLWallpaperService.java
new file mode 100644 (file)
index 0000000..63a5be5
--- /dev/null
@@ -0,0 +1,357 @@
+/*
+ * Copyright (c) 2011 Ben Gruver
+ * All rights reserved.
+ *
+ * You may use this code at your option under the following BSD license
+ * or Apache 2.0 license terms
+ *
+ * [The "BSD license"]
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * [The "Apache 2.0 license"]
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package net.rbgrn.android.glwallpaperservice;
+
+import android.opengl.GLSurfaceView;
+import android.service.wallpaper.WallpaperService;
+import android.view.SurfaceHolder;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+public abstract class GLWallpaperService extends WallpaperService {
+    public interface Renderer extends GLSurfaceView.Renderer {
+    }
+
+    public class GLEngine extends WallpaperService.Engine {
+       public final static int RENDERMODE_WHEN_DIRTY = 0;
+       public final static int RENDERMODE_CONTINUOUSLY = 1;
+
+        private Object lock = new Object();
+        private GLSurfaceView mGLSurfaceView = null;
+
+        private int debugFlags;
+        private int renderMode;
+
+        /**
+         * If we don't have a GLSurfaceView yet, then we queue up any operations that are requested, until the
+         * GLSurfaceView is created.
+         *
+         * Initially, we created the glSurfaceView in the GLEngine constructor, and things seemed to work. However,
+         * it turns out a few devices aren't set up to handle the surface related events at this point, and crash.
+         *
+         * This is a work around so that we can delay the creation of the GLSurfaceView until the surface is actually
+         * created, so that the underlying code should be in a state to be able to handle the surface related events
+         * that get fired when GLSurfaceView is created.
+         */
+        private List<Runnable> pendingOperations = new ArrayList<Runnable>();
+
+        public GLEngine() {
+        }
+
+        public void setGLWrapper(final GLSurfaceView.GLWrapper glWrapper) {
+            synchronized (lock) {
+                if (mGLSurfaceView != null) {
+                    mGLSurfaceView.setGLWrapper(glWrapper);
+                } else {
+                    pendingOperations.add(new Runnable() {
+                        public void run() {
+                            setGLWrapper(glWrapper);
+                        }
+                    });
+                }
+            }
+        }
+
+        public void setDebugFlags(final int debugFlags) {
+            synchronized (lock) {
+                if (mGLSurfaceView != null) {
+                    mGLSurfaceView.setDebugFlags(debugFlags);
+                } else {
+                    this.debugFlags = debugFlags;
+                    pendingOperations.add(new Runnable() {
+                        public void run() {
+                            setDebugFlags(debugFlags);
+                        }
+                    });
+                }
+            }
+        }
+
+        public int getDebugFlags() {
+            synchronized (lock) {
+                if (mGLSurfaceView != null) {
+                    return mGLSurfaceView.getDebugFlags();
+                } else {
+                    return debugFlags;
+                }
+            }
+        }
+
+        public void setRenderer(final GLSurfaceView.Renderer renderer) {
+            synchronized (lock) {
+                if (mGLSurfaceView != null) {
+                    mGLSurfaceView.setRenderer(renderer);
+                    if (!isVisible()) {
+                        mGLSurfaceView.onPause();
+                    }
+                } else {
+                    pendingOperations.add(new Runnable() {
+                        public void run() {
+                            setRenderer(renderer);
+                        }
+                    });
+                }
+            }
+        }
+
+        public void queueEvent(final Runnable r) {
+            synchronized (lock) {
+                if (mGLSurfaceView != null) {
+                    mGLSurfaceView.queueEvent(r);
+                } else {
+                    pendingOperations.add(new Runnable() {
+                        public void run() {
+                            queueEvent(r);
+                        }
+                    });
+                }
+            }
+        }
+
+        public void setEGLContextFactory(final GLSurfaceView.EGLContextFactory factory) {
+            synchronized (lock) {
+                if (mGLSurfaceView != null) {
+                    mGLSurfaceView.setEGLContextFactory(factory);
+                } else {
+                    pendingOperations.add(new Runnable() {
+                        public void run() {
+                            setEGLContextFactory(factory);
+                        }
+                    });
+                }
+            }
+        }
+
+        public void setEGLWindowSurfaceFactory(final GLSurfaceView.EGLWindowSurfaceFactory factory) {
+            synchronized (lock) {
+                if (mGLSurfaceView != null) {
+                    mGLSurfaceView.setEGLWindowSurfaceFactory(factory);
+                } else {
+                    pendingOperations.add(new Runnable() {
+                        public void run() {
+                            setEGLWindowSurfaceFactory(factory);
+                        }
+                    });
+                }
+            }
+        }
+
+        public void setEGLConfigChooser(final GLSurfaceView.EGLConfigChooser configChooser) {
+            synchronized (lock) {
+                if (mGLSurfaceView != null) {
+                    mGLSurfaceView.setEGLConfigChooser(configChooser);
+                } else {
+                    pendingOperations.add(new Runnable() {
+                        public void run() {
+                            setEGLConfigChooser(configChooser);
+                        }
+                    });
+                }
+            }
+        }
+
+        public void setEGLConfigChooser(final boolean needDepth) {
+            synchronized (lock) {
+                if (mGLSurfaceView != null) {
+                    mGLSurfaceView.setEGLConfigChooser(needDepth);
+                } else {
+                    pendingOperations.add(new Runnable() {
+                        public void run() {
+                            setEGLConfigChooser(needDepth);
+                        }
+                    });
+                }
+            }
+        }
+
+        public void setEGLConfigChooser(final int redSize, final int greenSize, final int blueSize,
+            final int alphaSize, final int depthSize, final int stencilSize) {
+            synchronized (lock) {
+                if (mGLSurfaceView != null) {
+                    mGLSurfaceView.setEGLConfigChooser(redSize, greenSize, blueSize,
+                        alphaSize, depthSize, stencilSize);
+                } else {
+                    pendingOperations.add(new Runnable() {
+                        public void run() {
+                            setEGLConfigChooser(redSize, greenSize, blueSize, alphaSize, depthSize, stencilSize);
+                        }
+                    });
+                }
+            }
+        }
+
+        public void setEGLContextClientVersion(final int version) {
+            synchronized (lock) {
+                Method method = null;
+
+                try {
+                    //the setEGLContextClientVersion method is first available in api level 8, but we would
+                    //like to support compiling against api level 7
+                    method = GLSurfaceView.class.getMethod("setEGLContextClientVersion", int.class);
+                } catch (NoSuchMethodException ex) {
+                    return;
+                }
+
+                if (mGLSurfaceView != null) {
+                    try {
+                        method.invoke(mGLSurfaceView, version);
+                    } catch (IllegalAccessException ex) {
+                        return;
+                    } catch (InvocationTargetException ex) {
+                        return;
+                    }
+                } else {
+                    pendingOperations.add(new Runnable() {
+                        public void run() {
+                            setEGLContextClientVersion(version);
+                        }
+                    });
+                }
+            }
+        }
+
+        public void setRenderMode(final int renderMode) {
+            synchronized (lock) {
+                if (mGLSurfaceView != null) {
+                    mGLSurfaceView.setRenderMode(renderMode);
+                } else {
+                    this.renderMode = renderMode;
+                    pendingOperations.add(new Runnable() {
+                        public void run() {
+                            setRenderMode(renderMode);
+                        }
+                    });
+                }
+            }
+        }
+
+        public int getRenderMode() {
+            synchronized (lock) {
+                if (mGLSurfaceView != null) {
+                    return mGLSurfaceView.getRenderMode();
+                } else {
+                    return renderMode;
+                }
+            }
+        }
+
+        public void requestRender() {
+            if (mGLSurfaceView != null) {
+                mGLSurfaceView.requestRender();
+            }
+        }
+
+        @Override
+        public void onVisibilityChanged(final boolean visible) {
+            super.onVisibilityChanged(visible);
+
+            synchronized (lock) {
+                if (mGLSurfaceView != null) {
+                    if (visible) {
+                        mGLSurfaceView.onResume();
+                    } else {
+                        mGLSurfaceView.onPause();
+                    }
+                } else {
+                    pendingOperations.add(new Runnable() {
+                        public void run() {
+                            if (visible) {
+                                mGLSurfaceView.onResume();
+                            } else {
+                                mGLSurfaceView.onPause();
+                            }
+                        }
+                    });
+                }
+            }
+        }
+
+        @Override
+        public void onSurfaceChanged(final SurfaceHolder holder, final int format, final int width, final int height) {
+            synchronized (lock) {
+                if (mGLSurfaceView != null) {
+                    mGLSurfaceView.surfaceChanged(holder, format, width, height);
+                } else {
+                    pendingOperations.add(new Runnable() {
+                        public void run() {
+                            onSurfaceChanged(holder, format, width, height);
+                        }
+                    });
+                }
+            }
+        }
+
+        @Override
+        public void onSurfaceCreated(SurfaceHolder holder) {
+            synchronized (lock) {
+                if (mGLSurfaceView == null) {
+                    mGLSurfaceView = new GLSurfaceView(GLWallpaperService.this) {
+                        @Override
+                        public SurfaceHolder getHolder() {
+                            return GLEngine.this.getSurfaceHolder();
+                        }
+                    };
+                    for (Runnable pendingOperation: pendingOperations) {
+                        pendingOperation.run();
+                    }
+                    pendingOperations.clear();
+                }
+                mGLSurfaceView.surfaceCreated(holder);
+            }
+        }
+
+        @Override
+        public void onSurfaceDestroyed(SurfaceHolder holder) {
+            synchronized (lock) {
+                if (mGLSurfaceView != null) {
+                    mGLSurfaceView.surfaceDestroyed(holder);
+                }
+            }
+        }
+    }
+}
diff --git a/android/project/xscreensaver/AndroidManifest.xml b/android/project/xscreensaver/AndroidManifest.xml
new file mode 100644 (file)
index 0000000..d9fc30a
--- /dev/null
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+      package="org.jwz.xscreensaver"
+      android:versionCode="1"
+      android:versionName="1.0">
+    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" />
+
+    <application android:icon="@drawable/thumbnail" android:label="@string/app_name" android:name=".XscreensaverApp">
+
+
+       <service android:label="@string/superquadrics_name" android:name=".gen.SuperquadricsService"
+               android:permission="android.permission.BIND_WALLPAPER">
+               <intent-filter>
+                       <action android:name="android.service.wallpaper.WallpaperService" />
+               </intent-filter>
+               <meta-data android:name="android.service.wallpaper"
+                       android:resource="@xml/superquadrics" />
+       </service>
+        <activity
+           android:label="@string/superquadrics_settings"
+           android:name="org.jwz.xscreensaver.gen.SuperquadricsSettings"
+           android:theme="@android:style/Theme.Light.WallpaperSettings"
+           android:exported="true">
+        </activity>
+
+
+       <service android:label="@string/sproingies_name" android:name=".gen.SproingiesService"
+               android:permission="android.permission.BIND_WALLPAPER">
+               <intent-filter>
+                       <action android:name="android.service.wallpaper.WallpaperService" />
+               </intent-filter>
+               <meta-data android:name="android.service.wallpaper"
+                       android:resource="@xml/sproingies" />
+       </service>
+        <activity
+           android:label="@string/sproingies_settings"
+           android:name="org.jwz.xscreensaver.gen.SproingiesSettings"
+           android:theme="@android:style/Theme.Light.WallpaperSettings"
+           android:exported="true">
+        </activity>
+
+
+
+    </application>
+
+    <uses-sdk android:minSdkVersion="14" />
+       <uses-feature android:name="android.software.live_wallpaper" android:required="true" />
+</manifest> 
diff --git a/android/project/xscreensaver/build.xml b/android/project/xscreensaver/build.xml
new file mode 100644 (file)
index 0000000..abda7fe
--- /dev/null
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="Xscreensaver" default="help">
+
+    <!-- The local.properties file is created and updated by the 'android' tool.
+         It contains the path to the SDK. It should *NOT* be checked into
+         Version Control Systems. -->
+    <property file="local.properties" />
+
+    <!-- The ant.properties file can be created by you. It is only edited by the
+         'android' tool to add properties to it.
+         This is the place to change some Ant specific build properties.
+         Here are some properties you may want to change/update:
+
+         source.dir
+             The name of the source directory. Default is 'src'.
+         out.dir
+             The name of the output directory. Default is 'bin'.
+
+         For other overridable properties, look at the beginning of the rules
+         files in the SDK, at tools/ant/build.xml
+
+         Properties related to the SDK location or the project target should
+         be updated using the 'android' tool with the 'update' action.
+
+         This file is an integral part of the build system for your
+         application and should be checked into Version Control Systems.
+
+         -->
+    <property file="ant.properties" />
+
+    <!-- if sdk.dir was not set from one of the property file, then
+         get it from the ANDROID_HOME env var.
+         This must be done before we load project.properties since
+         the proguard config can use sdk.dir -->
+    <property environment="env" />
+    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
+        <isset property="env.ANDROID_HOME" />
+    </condition>
+
+    <!-- The project.properties file is created and updated by the 'android'
+         tool, as well as ADT.
+
+         This contains project specific properties such as project target, and library
+         dependencies. Lower level build properties are stored in ant.properties
+         (or in .classpath for Eclipse projects).
+
+         This file is an integral part of the build system for your
+         application and should be checked into Version Control Systems. -->
+    <loadproperties srcFile="project.properties" />
+
+    <!-- quick check on sdk.dir -->
+    <fail
+            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
+            unless="sdk.dir"
+    />
+
+    <!--
+        Import per project custom build rules if present at the root of the project.
+        This is the place to put custom intermediary targets such as:
+            -pre-build
+            -pre-compile
+            -post-compile (This is typically used for code obfuscation.
+                           Compiled code location: ${out.classes.absolute.dir}
+                           If this is not done in place, override ${out.dex.input.absolute.dir})
+            -post-package
+            -post-build
+            -pre-clean
+    -->
+    <import file="custom_rules.xml" optional="true" />
+
+    <!-- Import the actual build file.
+
+         To customize existing targets, there are two options:
+         - Customize only one target:
+             - copy/paste the target into this file, *before* the
+               <import> task.
+             - customize it to your needs.
+         - Customize the whole content of build.xml
+             - copy/paste the content of the rules files (minus the top node)
+               into this file, replacing the <import> task.
+             - customize to your needs.
+
+         ***********************
+         ****** IMPORTANT ******
+         ***********************
+         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
+         in order to avoid having your file be overridden by tools such as "android update project"
+    -->
+    <!-- version-tag: 1 -->
+    <import file="${sdk.dir}/tools/ant/build.xml" />
+
+</project>
diff --git a/android/project/xscreensaver/jni/Android.mk b/android/project/xscreensaver/jni/Android.mk
new file mode 100644 (file)
index 0000000..459e166
--- /dev/null
@@ -0,0 +1,46 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := xscreensaver
+
+LOCAL_SRC_FILES := \
+    xscreensaver/hacks/xlockmore.c \
+    xscreensaver/hacks/fps.c \
+    xscreensaver/hacks/glx/fps-gl.c \
+    xscreensaver/hacks/glx/jwzgles.c \
+    xscreensaver/hacks/glx/rotator.c \
+    xscreensaver/hacks/glx/tube.c \
+    xscreensaver/hacks/glx/sphere.c \
+    xscreensaver/hacks/glx/sproingies.c \
+    xscreensaver/hacks/glx/sproingiewrap.c \
+    xscreensaver/hacks/glx/gllist.c \
+    xscreensaver/hacks/glx/s1_1.c \
+    xscreensaver/hacks/glx/s1_2.c \
+    xscreensaver/hacks/glx/s1_3.c \
+    xscreensaver/hacks/glx/s1_4.c \
+    xscreensaver/hacks/glx/s1_5.c \
+    xscreensaver/hacks/glx/s1_6.c \
+    xscreensaver/hacks/glx/s1_b.c \
+    xscreensaver/hacks/glx/superquadrics.c \
+    xscreensaver/hacks/glx/trackball.c \
+    xscreensaver/hacks/glx/gltrackball.c \
+    xscreensaver/hacks/glx/texfont.c \
+    xscreensaver/utils/hsv.c \
+    xscreensaver/utils/colors.c \
+    xscreensaver/utils/resources.c \
+    xscreensaver/utils/xft.c \
+    xscreensaver/utils/utf8wc.c \
+    xscreensaver/utils/yarandom.c \
+    xscreensaver/android/XScreenSaverView.c \
+    xscreensaver/android/XScreenSaverGLView.c \
+    xscreensaver/android/jwxyz.c \
+    xscreensaver/android/glue.c
+
+LOCAL_LDLIBS := -lGLESv1_CM -ldl -llog
+
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/xscreensaver $(LOCAL_PATH)/xscreensaver/android $(LOCAL_PATH)/xscreensaver/utils $(LOCAL_PATH)/xscreensaver/hacks $(LOCAL_PATH)/xscreensaver/hacks/glx
+
+LOCAL_CFLAGS += -std=c99 -DSTANDALONE=1 -DUSE_GL=1 -DGETTIMEOFDAY_TWO_ARGS=1 -DHAVE_JWZGLES=1 -DHAVE_ANDROID=1 -DGL_VERSION_ES_CM_1_0
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/android/project/xscreensaver/jni/Application.mk b/android/project/xscreensaver/jni/Application.mk
new file mode 100644 (file)
index 0000000..60a4414
--- /dev/null
@@ -0,0 +1,8 @@
+APP_ABI := armeabi-v7a
+#APP_ABI := armeabi armeabi-v7a
+#APP_ABI := all
+APP_STL := stlport_static
+#APP_PLATFORM := android-10
+APP_PLATFORM := android-14
+# ^^ this can be increased
+
diff --git a/android/project/xscreensaver/jni/xscreensaver b/android/project/xscreensaver/jni/xscreensaver
new file mode 120000 (symlink)
index 0000000..c866b86
--- /dev/null
@@ -0,0 +1 @@
+../../../..
\ No newline at end of file
diff --git a/android/project/xscreensaver/local.properties b/android/project/xscreensaver/local.properties
new file mode 100644 (file)
index 0000000..0f7a802
--- /dev/null
@@ -0,0 +1,10 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must *NOT* be checked into Version Control Systems,
+# as it contains information specific to your local configuration.
+
+# location of the SDK. This is only used by Ant
+# For customization when using a Version Control System, please read the
+# header note.
+sdk.dir=/home/dws/dev/android-sdks
diff --git a/android/project/xscreensaver/project.properties b/android/project/xscreensaver/project.properties
new file mode 100644 (file)
index 0000000..572ed00
--- /dev/null
@@ -0,0 +1,15 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system edit
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+#
+# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
+#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
+
+android.library.reference.1=../GLWallpaperService
+# Project target.
+target=android-19
diff --git a/android/project/xscreensaver/res/drawable-hdpi/icon.png b/android/project/xscreensaver/res/drawable-hdpi/icon.png
new file mode 100644 (file)
index 0000000..8074c4c
Binary files /dev/null and b/android/project/xscreensaver/res/drawable-hdpi/icon.png differ
diff --git a/android/project/xscreensaver/res/drawable-ldpi/icon.png b/android/project/xscreensaver/res/drawable-ldpi/icon.png
new file mode 100644 (file)
index 0000000..1095584
Binary files /dev/null and b/android/project/xscreensaver/res/drawable-ldpi/icon.png differ
diff --git a/android/project/xscreensaver/res/drawable-mdpi/icon.png b/android/project/xscreensaver/res/drawable-mdpi/icon.png
new file mode 100644 (file)
index 0000000..a07c69f
Binary files /dev/null and b/android/project/xscreensaver/res/drawable-mdpi/icon.png differ
diff --git a/android/project/xscreensaver/res/drawable/hilbert.png b/android/project/xscreensaver/res/drawable/hilbert.png
new file mode 100644 (file)
index 0000000..d6772a9
Binary files /dev/null and b/android/project/xscreensaver/res/drawable/hilbert.png differ
diff --git a/android/project/xscreensaver/res/drawable/sproingies.png b/android/project/xscreensaver/res/drawable/sproingies.png
new file mode 100644 (file)
index 0000000..4ab3190
Binary files /dev/null and b/android/project/xscreensaver/res/drawable/sproingies.png differ
diff --git a/android/project/xscreensaver/res/drawable/stonerview.png b/android/project/xscreensaver/res/drawable/stonerview.png
new file mode 100644 (file)
index 0000000..06fe4d2
Binary files /dev/null and b/android/project/xscreensaver/res/drawable/stonerview.png differ
diff --git a/android/project/xscreensaver/res/drawable/superquadrics.png b/android/project/xscreensaver/res/drawable/superquadrics.png
new file mode 100644 (file)
index 0000000..0561e0d
Binary files /dev/null and b/android/project/xscreensaver/res/drawable/superquadrics.png differ
diff --git a/android/project/xscreensaver/res/drawable/thumbnail.png b/android/project/xscreensaver/res/drawable/thumbnail.png
new file mode 100644 (file)
index 0000000..06fe4d2
Binary files /dev/null and b/android/project/xscreensaver/res/drawable/thumbnail.png differ
diff --git a/android/project/xscreensaver/res/layout/main.xml b/android/project/xscreensaver/res/layout/main.xml
new file mode 100644 (file)
index 0000000..3a5f117
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    >
+<TextView  
+    android:layout_width="fill_parent" 
+    android:layout_height="wrap_content" 
+    android:text="@string/hello"
+    />
+</LinearLayout>
diff --git a/android/project/xscreensaver/res/values/settings.xml b/android/project/xscreensaver/res/values/settings.xml
new file mode 100644 (file)
index 0000000..3238916
--- /dev/null
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+* Copyright (C) 4008 The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*      http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+    <string-array name="stonerview_speed_names">
+        <item>"Off"</item>
+        <item>"On"</item>
+    </string-array>
+
+    <string-array name="stonerview_speed_prefix">
+        <item>"0"</item>
+        <item>"1"</item>
+    </string-array>
+
+
+    <string-array name="superquadrics_speed_names">
+        <item>"0.1"</item>
+        <item>"1"</item>
+        <item>"3"</item>
+        <item>"5"</item>
+        <item>"8"</item>
+        <item>"10</item>
+        <item>"15"</item>
+    </string-array>
+
+    <string-array name="superquadrics_speed_prefix">
+        <item>"0.1"</item>
+        <item>"1"</item>
+        <item>"3"</item>
+        <item>"5"</item>
+        <item>"8"</item>
+        <item>"10</item>
+        <item>"15"</item>
+    </string-array>
+
+
+
+    <string-array name="sproingies_count_names">
+        <item>"1"</item>
+        <item>"2"</item>
+        <item>"4"</item>
+        <item>"8"</item>
+        <item>"15"</item>
+        <item>"23"</item>
+        <item>"30"</item>
+    </string-array>
+
+    <string-array name="sproingies_count_prefix">
+        <item>"1"</item>
+        <item>"2"</item>
+        <item>"4"</item>
+        <item>"8"</item>
+        <item>"15"</item>
+        <item>"23"</item>
+        <item>"30"</item>
+    </string-array>
+
+
+    <string-array name="hilbert_mode_names">
+        <item>"2d"</item>
+        <item>"3d"</item>
+        <item>"random"</item>
+    </string-array>
+
+    <string-array name="hilbert_mode_prefix">
+        <item>"2d"</item>
+        <item>"3d"</item>
+        <item>"random"</item>
+    </string-array>
+
+
+
+</resources>
diff --git a/android/project/xscreensaver/res/values/strings.xml b/android/project/xscreensaver/res/values/strings.xml
new file mode 100644 (file)
index 0000000..c9d8969
--- /dev/null
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="hello">Hello World!</string>
+    <string name="service_label">Xscreensaver</string>
+    <string name="description">A live wallpaper</string>
+
+   <string name="app_name">Xscreensaver</string>
+   <string name="author">jwz and helpers</string>
+
+   <string name="stonerview_name">Stonerview</string>
+   <string name="stonerview_description">Stonerview</string>
+   <string name="stonerview_settings">Settings</string>
+   <string name="stonerview_speed_settings_title">Set transparency</string>
+   <string name="stonerview_speed_settings_summary">Choose transparency mode</string>
+
+   <string name="superquadrics_name">Superquadrics</string>
+   <string name="superquadrics_description">Superquadrics</string>
+   <string name="superquadrics_settings">Settings</string>
+   <string name="superquadrics_speed_settings_title">Select speed</string>
+   <string name="superquadrics_speed_settings_summary">Choose speed</string>
+
+   <string name="sproingies_name">Sproingies</string>
+   <string name="sproingies_description">Sproingies</string>
+   <string name="sproingies_settings">Settings</string>
+   <string name="sproingies_count_settings_title">Select count</string>
+   <string name="sproingies_count_settings_summary">Set number of sproingies</string>
+
+   <string name="hilbert_name">Hilbert</string>
+   <string name="hilbert_description">Hilbert</string>
+   <string name="hilbert_settings">Settings</string>
+   <string name="hilbert_mode_settings_title">Select mode</string>
+   <string name="hilbert_mode_settings_summary">Choose mode</string>
+
+</resources>
diff --git a/android/project/xscreensaver/res/xml/glwallpapertest.xml b/android/project/xscreensaver/res/xml/glwallpapertest.xml
new file mode 100644 (file)
index 0000000..cc6e508
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
+       android:description="@string/description"
+/>
diff --git a/android/project/xscreensaver/res/xml/hilbert.xml b/android/project/xscreensaver/res/xml/hilbert.xml
new file mode 100644 (file)
index 0000000..9af0906
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
+   android:description="@string/hilbert_description"
+   android:settingsActivity="org.jwz.xscreensaver.gen.HilbertSettings"
+   android:thumbnail="@drawable/hilbert" />
diff --git a/android/project/xscreensaver/res/xml/hilbert_settings.xml b/android/project/xscreensaver/res/xml/hilbert_settings.xml
new file mode 100644 (file)
index 0000000..225464c
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">    <PreferenceCategory
+        android:title="@string/hilbert_settings"
+        android:key="hilbertwallpaper_settings">
+    <ListPreference
+            android:key="hilbert_mode"
+            android:title="@string/hilbert_mode_settings_title"
+            android:summary="@string/hilbert_mode_settings_summary"
+            android:entries="@array/hilbert_mode_names"
+           android:defaultValue="3d"
+            android:entryValues="@array/hilbert_mode_prefix" />
+    </PreferenceCategory>
+</PreferenceScreen>
diff --git a/android/project/xscreensaver/res/xml/sproingies.xml b/android/project/xscreensaver/res/xml/sproingies.xml
new file mode 100644 (file)
index 0000000..35bfc8e
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
+   android:description="@string/sproingies_description"
+   android:settingsActivity="org.jwz.xscreensaver.gen.SproingiesSettings"
+   android:thumbnail="@drawable/sproingies" />
diff --git a/android/project/xscreensaver/res/xml/sproingies_settings.xml b/android/project/xscreensaver/res/xml/sproingies_settings.xml
new file mode 100644 (file)
index 0000000..f7904d7
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">    <PreferenceCategory
+        android:title="@string/sproingies_settings"
+        android:key="sproingieswallpaper_settings">
+    <ListPreference
+            android:key="sproingies_count"
+            android:title="@string/sproingies_count_settings_title"
+            android:summary="@string/sproingies_count_settings_summary"
+            android:entries="@array/sproingies_count_names"
+           android:defaultValue="8"
+            android:entryValues="@array/sproingies_count_prefix" />
+    </PreferenceCategory>
+</PreferenceScreen>
diff --git a/android/project/xscreensaver/res/xml/stonerview.xml b/android/project/xscreensaver/res/xml/stonerview.xml
new file mode 100644 (file)
index 0000000..6765291
--- /dev/null
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); 
+ * you may not use this file except in compliance with the License. 
+ * You may obtain a copy of the License at 
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0 
+ *
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License.
+ */
+-->
+<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
+   android:description="@string/stonerview_description"
+   android:settingsActivity="org.jwz.xscreensaver.gen.StonerviewSettings"
+   android:thumbnail="@drawable/stonerview" />
diff --git a/android/project/xscreensaver/res/xml/stonerview_settings.xml b/android/project/xscreensaver/res/xml/stonerview_settings.xml
new file mode 100644 (file)
index 0000000..eba6311
--- /dev/null
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+  
+          http://www.apache.org/licenses/LICENSE-2.0
+  
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+    <PreferenceCategory
+        android:title="@string/stonerview_settings"
+        android:key="stonerviewwallpaper_settings">
+
+    <ListPreference
+            android:key="stonerview_speed"
+            android:title="@string/stonerview_speed_settings_title"
+            android:summary="@string/stonerview_speed_settings_summary"
+            android:entries="@array/stonerview_speed_names"
+           android:defaultValue="1"
+            android:entryValues="@array/stonerview_speed_prefix" />
+
+    </PreferenceCategory>
+
+</PreferenceScreen>
diff --git a/android/project/xscreensaver/res/xml/superquadrics.xml b/android/project/xscreensaver/res/xml/superquadrics.xml
new file mode 100644 (file)
index 0000000..a203d94
--- /dev/null
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); 
+ * you may not use this file except in compliance with the License. 
+ * You may obtain a copy of the License at 
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0 
+ *
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License.
+ */
+-->
+<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
+   android:description="@string/superquadrics_description"
+   android:settingsActivity="org.jwz.xscreensaver.gen.SuperquadricsSettings"
+   android:thumbnail="@drawable/superquadrics" />
diff --git a/android/project/xscreensaver/res/xml/superquadrics_settings.xml b/android/project/xscreensaver/res/xml/superquadrics_settings.xml
new file mode 100644 (file)
index 0000000..e92aa2d
--- /dev/null
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+  
+          http://www.apache.org/licenses/LICENSE-2.0
+  
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+    <PreferenceCategory
+        android:title="@string/superquadrics_settings"
+        android:key="superquadricswallpaper_settings">
+
+    <ListPreference
+            android:key="superquadrics_speed"
+            android:title="@string/superquadrics_speed_settings_title"
+            android:summary="@string/superquadrics_speed_settings_summary"
+            android:entries="@array/superquadrics_speed_names"
+           android:defaultValue="5"
+            android:entryValues="@array/superquadrics_speed_prefix" />
+
+    </PreferenceCategory>
+
+</PreferenceScreen>
diff --git a/android/project/xscreensaver/src/org/jwz/xscreensaver/ARenderer.java b/android/project/xscreensaver/src/org/jwz/xscreensaver/ARenderer.java
new file mode 100644 (file)
index 0000000..fd65be1
--- /dev/null
@@ -0,0 +1,132 @@
+package org.jwz.xscreensaver;
+
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.opengles.GL10;
+
+import net.rbgrn.android.glwallpaperservice.*;
+import android.opengl.GLU;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+
+
+// Original code provided by Robert Green
+// http://www.rbgrn.net/content/354-glsurfaceview-adapted-3d-live-wallpapers
+public class ARenderer implements GLWallpaperService.Renderer {
+
+    CallNative cn;
+    boolean secondRun = false;
+
+    // Used for Lighting
+    //private static float[] ambientComponent0 = {0.3f, 0.3f, 1.0f, 1.0f};
+    //private static float[] ambientComponent0 = {0.3f, 0.3f, 0.3f, 1.0f};
+    private static float[] ambientComponent0 = {0.5f, 0.5f, 0.5f, 1.0f};
+    private static float[] diffuseComponent0 = {1.0f, 1.0f, 1.0f, 1.0f};
+    private static float[] lightPosition0 =    {1f, 1f, -1f, 0f};
+
+    public void onDrawFrame(GL10 gl) {
+        if (!secondRun) {
+            secondRun = true;
+            return;
+        }
+        //gl.glClearColor(0.2f, 0.6f, 0.2f, 1f);
+        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
+    }
+
+    public void onSurfaceChanged(GL10 gl, int width, int height) {
+
+        gl.glMatrixMode(GL10.GL_PROJECTION);
+        gl.glLoadIdentity();
+        GLU.gluPerspective(gl, 60f, (float)width/(float)height, 1f, 100f);
+
+        gl.glMatrixMode(GL10.GL_MODELVIEW);
+        gl.glLoadIdentity();
+
+        gl.glMatrixMode(GL10.GL_MODELVIEW);
+        gl.glTranslatef(0, 0, -5);
+        gl.glRotatef(30f, 1, 0, 0);
+
+        gl.glEnable(GL10.GL_LIGHTING);
+        gl.glEnable(GL10.GL_RESCALE_NORMAL);
+        gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);
+//Set the color of light bouncing off of surfaces to respect the surface color
+        gl.glEnable(GL10.GL_COLOR_MATERIAL);
+
+        setupLightSources(gl);
+
+// Turn on a global ambient light. The "Cosmic Background Radiation", if you will.
+        //float[] ambientLightRGB = {0.3f, 0.3f, 0.3f, 1.0f};
+        float[] ambientLightRGB = {0.5f, 0.5f, 0.5f, 1.0f};
+        gl.glLightModelfv(GL10.GL_LIGHT_MODEL_AMBIENT, ambientLightRGB, 0);
+        NonSurfaceChanged(width, height);
+    }
+
+    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
+
+        if (!secondRun) {
+            return;
+        }
+        cn = new CallNative();
+
+        gl.glClearDepthf(1f);
+        gl.glEnable(GL10.GL_DEPTH_TEST);
+        gl.glDepthFunc(GL10.GL_LEQUAL);
+
+//Turn on culling, so OpenGL only draws one side of the primitives
+        gl.glEnable(GL10.GL_CULL_FACE);
+//Define the front of a primitive to be the side where the listed vertexes are counterclockwise
+        gl.glFrontFace(GL10.GL_CCW);
+//Do not draw the backs of primitives
+        gl.glCullFace(GL10.GL_BACK);
+
+    }
+
+    private void setupLightSources(GL10 gl) {
+        if (!secondRun) {
+            return;
+        }
+        //Enable Light source 0
+        gl.glEnable(GL10.GL_LIGHT0);
+
+        //Useful part of the Arrays start a 0
+        gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, ambientComponent0, 0);
+        gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, diffuseComponent0, 0);
+
+        //Position the light in the scene
+        gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightPosition0, 0);
+    }
+
+    /**
+     * Called when the engine is destroyed. Do any necessary clean up because
+     * at this point your renderer instance is now done for.
+     */
+    public void release() {
+        NonDone();
+
+    }
+
+    public void NonSurfaceCreated() {
+        cn.nativeInit();
+    }
+
+    void NonSurfaceChanged(int w, int h) {
+        if (!secondRun) {
+            return;
+        }
+        cn.nativeResize(w, h);
+    }
+
+    void NonDrawFrame() {
+        cn.nativeRender();
+    }
+
+    void NonDone() {
+        cn.nativeDone();
+    }
+
+    static
+    {
+        System.loadLibrary ("xscreensaver");
+    }
+
+}
diff --git a/android/project/xscreensaver/src/org/jwz/xscreensaver/BufferFactory.java b/android/project/xscreensaver/src/org/jwz/xscreensaver/BufferFactory.java
new file mode 100644 (file)
index 0000000..228928f
--- /dev/null
@@ -0,0 +1,46 @@
+package org.jwz.xscreensaver;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+import java.nio.ShortBuffer;
+
+/**
+ * A utility class to create buffers.
+ *
+ * All public methods are static. The Singleton pattern was avoided to avoid concerns about
+ * threading and the Android life cycle. If needed, It can be implemented later given some research.
+ */
+public class BufferFactory {
+    // This class cannot and should not be instantiated
+    private BufferFactory() {}
+
+    // We use Buffer.allocateDirect() to get memory outside of
+    // the normal, garbage collected heap. I think this is done
+    // because the buffer is subject to native I/O.
+    // See http://download.oracle.com/javase/1.4.2/docs/api/java/nio/ByteBuffer.html#direct
+
+    /**
+     * Creates a buffer of floats using memory outside the normal, garbage collected heap
+     *
+     * @param capacity         The number of primitives to create in the buffer.
+     */
+    public static FloatBuffer createFloatBuffer(int capacity) {
+        // 4 is the number of bytes in a float
+        ByteBuffer vbb = ByteBuffer.allocateDirect(capacity * 4);
+        vbb.order(ByteOrder.nativeOrder());
+        return vbb.asFloatBuffer();
+    }
+
+    /**
+     * Creates a buffer of shorts using memory outside the normal, garbage collected heap
+     *
+     * @param capacity         The number of primitives to create in the buffer.
+     */
+    public static ShortBuffer createShortBuffer(int capacity) {
+        // 2 is the number of bytes in a short
+        ByteBuffer vbb = ByteBuffer.allocateDirect(capacity * 2);
+        vbb.order(ByteOrder.nativeOrder());
+        return vbb.asShortBuffer();
+    }
+}
diff --git a/android/project/xscreensaver/src/org/jwz/xscreensaver/CallNative.java b/android/project/xscreensaver/src/org/jwz/xscreensaver/CallNative.java
new file mode 100644 (file)
index 0000000..be8c66d
--- /dev/null
@@ -0,0 +1,25 @@
+package org.jwz.xscreensaver;
+
+public class CallNative {
+
+    void onSurfaceCreated() {
+        nativeInit();
+    }
+
+    void onSurfaceChanged(int w, int h) {
+        nativeResize(w, h);
+    }
+
+    void onDrawFrame() {
+        nativeRender();
+    }
+
+    void onDone() {
+        nativeDone();
+    }
+
+    public static native void nativeInit();
+    public static native void nativeResize(int w, int h);
+    public static native void nativeRender();
+    public static native void nativeDone();
+}
diff --git a/android/project/xscreensaver/src/org/jwz/xscreensaver/XscreensaverApp.java b/android/project/xscreensaver/src/org/jwz/xscreensaver/XscreensaverApp.java
new file mode 100644 (file)
index 0000000..609ef32
--- /dev/null
@@ -0,0 +1,18 @@
+package org.jwz.xscreensaver;
+
+import android.app.Application;
+import android.content.SharedPreferences;
+
+public class XscreensaverApp extends Application {
+
+    public XscreensaverApp() {
+        super();
+    }
+
+
+    public SharedPreferences getThePrefs(String p) {
+        SharedPreferences prefs = getApplicationContext().getSharedPreferences(p, 0);
+        return prefs;
+    }
+
+}
diff --git a/android/project/xscreensaver/src/org/jwz/xscreensaver/gen/HilbertService.java b/android/project/xscreensaver/src/org/jwz/xscreensaver/gen/HilbertService.java
new file mode 100644 (file)
index 0000000..a098205
--- /dev/null
@@ -0,0 +1,49 @@
+package org.jwz.xscreensaver.gen;
+import net.rbgrn.android.glwallpaperservice.*;
+import android.content.SharedPreferences;
+import org.jwz.xscreensaver.*;
+
+// Original code provided by Robert Green
+// http://www.rbgrn.net/content/354-glsurfaceview-adapted-3d-live-wallpapers
+public class HilbertService extends GLWallpaperService {
+    SharedPreferences sp;
+    public HilbertService() {
+        super();
+    }
+    @Override
+    public void onCreate() {
+        sp = ((XscreensaverApp)getApplication()).getThePrefs(HilbertWallpaper.SHARED_PREFS_NAME);
+    }
+    public Engine onCreateEngine() {
+        MyEngine engine = new MyEngine();
+        return engine;
+    }
+    class MyEngine extends GLEngine {
+        HilbertWallpaper renderer;
+        public MyEngine() {
+            super();
+            // handle prefs, other initialization
+            renderer = new HilbertWallpaper();
+            setRenderer(renderer);
+            setRenderMode(RENDERMODE_CONTINUOUSLY);
+        }
+        public void onDestroy() {
+            super.onDestroy();
+            if (renderer != null) {
+                renderer.release(); // assuming yours has this method - it should!
+            }
+            renderer = null;
+        }
+        @Override
+        public void onVisibilityChanged(boolean visible) {
+            super.onVisibilityChanged(visible);
+            if (visible) {
+                renderer.doSP(sp);
+            }
+        }
+    }
+    static
+    {
+        System.loadLibrary ("xscreensaver");
+    }
+}
diff --git a/android/project/xscreensaver/src/org/jwz/xscreensaver/gen/HilbertSettings.java b/android/project/xscreensaver/src/org/jwz/xscreensaver/gen/HilbertSettings.java
new file mode 100644 (file)
index 0000000..ec0378a
--- /dev/null
@@ -0,0 +1,30 @@
+package org.jwz.xscreensaver.gen;
+import org.jwz.xscreensaver.R;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.preference.PreferenceActivity;
+public class HilbertSettings extends PreferenceActivity
+    implements SharedPreferences.OnSharedPreferenceChangeListener {
+    @Override
+    protected void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        getPreferenceManager().setSharedPreferencesName(
+            HilbertWallpaper.SHARED_PREFS_NAME);
+        addPreferencesFromResource(R.xml.hilbert_settings);
+        getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(
+            this);
+    }
+    @Override
+    protected void onResume() {
+        super.onResume();
+    }
+    @Override
+    protected void onDestroy() {
+        getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(
+            this);
+        super.onDestroy();
+    }
+    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
+                                          String key) {
+    }
+}
diff --git a/android/project/xscreensaver/src/org/jwz/xscreensaver/gen/HilbertWallpaper.java b/android/project/xscreensaver/src/org/jwz/xscreensaver/gen/HilbertWallpaper.java
new file mode 100644 (file)
index 0000000..f965290
--- /dev/null
@@ -0,0 +1,36 @@
+package org.jwz.xscreensaver.gen;
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.opengles.GL10;
+import net.rbgrn.android.glwallpaperservice.*;
+import android.opengl.GLU;
+import android.content.Context;
+import android.content.SharedPreferences;
+import org.jwz.xscreensaver.*;
+public class HilbertWallpaper extends ARenderer {
+    private static native void nativeSettings(String hack, String hackPref, int draw);
+    public static final String SHARED_PREFS_NAME="hilbertsettings";
+    CallNative cn;
+    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
+        super.onSurfaceCreated(gl, config);
+        cn = new CallNative();
+        NonSurfaceCreated();
+    }
+    public void onDrawFrame(GL10 gl) {
+        super.onDrawFrame(gl);
+        nativeSettings("bogus", "bogus", 1);
+        NonDrawFrame();
+    }
+    void NonDrawFrame() {
+        cn.nativeRender();
+    }
+    void doSP(SharedPreferences sspp) {
+        //String hackPref = sspp.getString("hilbert_quad", "75"); // key
+        String hackPref = sspp.getString("hilbert_mode", "3d"); // key
+        String hack = "hilbert";
+        nativeSettings(hack, hackPref, 0);
+    }
+    static
+    {
+        System.loadLibrary ("xscreensaver");
+    }
+}
diff --git a/android/project/xscreensaver/src/org/jwz/xscreensaver/gen/SproingiesService.java b/android/project/xscreensaver/src/org/jwz/xscreensaver/gen/SproingiesService.java
new file mode 100644 (file)
index 0000000..8cddbeb
--- /dev/null
@@ -0,0 +1,49 @@
+package org.jwz.xscreensaver.gen;
+import net.rbgrn.android.glwallpaperservice.*;
+import android.content.SharedPreferences;
+import org.jwz.xscreensaver.*;
+
+// Original code provided by Robert Green
+// http://www.rbgrn.net/content/354-glsurfaceview-adapted-3d-live-wallpapers
+public class SproingiesService extends GLWallpaperService {
+    SharedPreferences sp;
+    public SproingiesService() {
+        super();
+    }
+    @Override
+    public void onCreate() {
+        sp = ((XscreensaverApp)getApplication()).getThePrefs(SproingiesWallpaper.SHARED_PREFS_NAME);
+    }
+    public Engine onCreateEngine() {
+        MyEngine engine = new MyEngine();
+        return engine;
+    }
+    class MyEngine extends GLEngine {
+        SproingiesWallpaper renderer;
+        public MyEngine() {
+            super();
+            // handle prefs, other initialization
+            renderer = new SproingiesWallpaper();
+            setRenderer(renderer);
+            setRenderMode(RENDERMODE_CONTINUOUSLY);
+        }
+        public void onDestroy() {
+            super.onDestroy();
+            if (renderer != null) {
+                renderer.release(); // assuming yours has this method - it should!
+            }
+            renderer = null;
+        }
+        @Override
+        public void onVisibilityChanged(boolean visible) {
+            super.onVisibilityChanged(visible);
+            if (visible) {
+                renderer.doSP(sp);
+            }
+        }
+    }
+    static
+    {
+        System.loadLibrary ("xscreensaver");
+    }
+}
diff --git a/android/project/xscreensaver/src/org/jwz/xscreensaver/gen/SproingiesSettings.java b/android/project/xscreensaver/src/org/jwz/xscreensaver/gen/SproingiesSettings.java
new file mode 100644 (file)
index 0000000..0e29a8c
--- /dev/null
@@ -0,0 +1,30 @@
+package org.jwz.xscreensaver.gen;
+import org.jwz.xscreensaver.R;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.preference.PreferenceActivity;
+public class SproingiesSettings extends PreferenceActivity
+    implements SharedPreferences.OnSharedPreferenceChangeListener {
+    @Override
+    protected void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        getPreferenceManager().setSharedPreferencesName(
+            SproingiesWallpaper.SHARED_PREFS_NAME);
+        addPreferencesFromResource(R.xml.sproingies_settings);
+        getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(
+            this);
+    }
+    @Override
+    protected void onResume() {
+        super.onResume();
+    }
+    @Override
+    protected void onDestroy() {
+        getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(
+            this);
+        super.onDestroy();
+    }
+    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
+                                          String key) {
+    }
+}
diff --git a/android/project/xscreensaver/src/org/jwz/xscreensaver/gen/SproingiesWallpaper.java b/android/project/xscreensaver/src/org/jwz/xscreensaver/gen/SproingiesWallpaper.java
new file mode 100644 (file)
index 0000000..71b081b
--- /dev/null
@@ -0,0 +1,35 @@
+package org.jwz.xscreensaver.gen;
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.opengles.GL10;
+import net.rbgrn.android.glwallpaperservice.*;
+import android.opengl.GLU;
+import android.content.Context;
+import android.content.SharedPreferences;
+import org.jwz.xscreensaver.*;
+public class SproingiesWallpaper extends ARenderer {
+    private static native void nativeSettings(String hack, String hackPref, int draw);
+    public static final String SHARED_PREFS_NAME="sproingiessettings";
+    CallNative cn;
+    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
+        super.onSurfaceCreated(gl, config);
+        cn = new CallNative();
+        NonSurfaceCreated();
+    }
+    public void onDrawFrame(GL10 gl) {
+        super.onDrawFrame(gl);
+        nativeSettings("bogus", "bogus", 1);
+        NonDrawFrame();
+    }
+    void NonDrawFrame() {
+        cn.nativeRender();
+    }
+    void doSP(SharedPreferences sspp) {
+        String hackPref = sspp.getString("sproingies_count", "8"); // key
+        String hack = "sproingies";
+        nativeSettings(hack, hackPref, 0);
+    }
+    static
+    {
+        System.loadLibrary ("xscreensaver");
+    }
+}
diff --git a/android/project/xscreensaver/src/org/jwz/xscreensaver/gen/StonerviewService.java b/android/project/xscreensaver/src/org/jwz/xscreensaver/gen/StonerviewService.java
new file mode 100644 (file)
index 0000000..177e528
--- /dev/null
@@ -0,0 +1,60 @@
+package org.jwz.xscreensaver.gen;
+
+import net.rbgrn.android.glwallpaperservice.*;
+import android.content.SharedPreferences;
+import org.jwz.xscreensaver.*;
+
+// Original code provided by Robert Green
+// http://www.rbgrn.net/content/354-glsurfaceview-adapted-3d-live-wallpapers
+public class StonerviewService extends GLWallpaperService {
+
+    SharedPreferences sp;
+
+    public StonerviewService() {
+        super();
+    }
+
+    @Override
+    public void onCreate() {
+        sp = ((XscreensaverApp)getApplication()).getThePrefs(StonerviewWallpaper.SHARED_PREFS_NAME);
+    }
+
+    public Engine onCreateEngine() {
+        MyEngine engine = new MyEngine();
+        return engine;
+    }
+
+    class MyEngine extends GLEngine {
+        StonerviewWallpaper renderer;
+        public MyEngine() {
+            super();
+            // handle prefs, other initialization
+            renderer = new StonerviewWallpaper();
+            setRenderer(renderer);
+            setRenderMode(RENDERMODE_CONTINUOUSLY);
+        }
+
+        public void onDestroy() {
+            super.onDestroy();
+            if (renderer != null) {
+                renderer.release(); // assuming yours has this method - it should!
+            }
+            renderer = null;
+        }
+
+        @Override
+        public void onVisibilityChanged(boolean visible) {
+            super.onVisibilityChanged(visible);
+            if (visible) {
+                renderer.doSP(sp);
+            }
+        }
+
+    }
+    static
+    {
+        System.loadLibrary ("xscreensaver");
+    }
+
+
+}
diff --git a/android/project/xscreensaver/src/org/jwz/xscreensaver/gen/StonerviewSettings.java b/android/project/xscreensaver/src/org/jwz/xscreensaver/gen/StonerviewSettings.java
new file mode 100644 (file)
index 0000000..4302126
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.jwz.xscreensaver.gen;
+
+import org.jwz.xscreensaver.R;
+
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.preference.PreferenceActivity;
+
+public class StonerviewSettings extends PreferenceActivity
+    implements SharedPreferences.OnSharedPreferenceChangeListener {
+
+    @Override
+    protected void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        getPreferenceManager().setSharedPreferencesName(
+            StonerviewWallpaper.SHARED_PREFS_NAME);
+        addPreferencesFromResource(R.xml.stonerview_settings);
+        getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(
+            this);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+    }
+
+    @Override
+    protected void onDestroy() {
+        getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(
+            this);
+        super.onDestroy();
+    }
+
+    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
+                                          String key) {
+    }
+}
diff --git a/android/project/xscreensaver/src/org/jwz/xscreensaver/gen/StonerviewWallpaper.java b/android/project/xscreensaver/src/org/jwz/xscreensaver/gen/StonerviewWallpaper.java
new file mode 100644 (file)
index 0000000..4d36cc8
--- /dev/null
@@ -0,0 +1,50 @@
+package org.jwz.xscreensaver.gen;
+
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.opengles.GL10;
+
+import net.rbgrn.android.glwallpaperservice.*;
+import android.opengl.GLU;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import org.jwz.xscreensaver.*;
+
+public class StonerviewWallpaper extends ARenderer {
+
+    private static native void nativeSettings(String hack, String hackPref, int draw);
+    public static final String SHARED_PREFS_NAME="stonerviewsettings";
+    CallNative cn;
+
+    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
+
+        super.onSurfaceCreated(gl, config);
+
+        cn = new CallNative();
+        NonSurfaceCreated();
+    }
+
+    public void onDrawFrame(GL10 gl) {
+        super.onDrawFrame(gl);
+        nativeSettings("bogus", "bogus", 1);
+        NonDrawFrame();
+    }
+
+    void NonDrawFrame() {
+        cn.nativeRender();
+    }
+
+    void doSP(SharedPreferences sspp) {
+        String hackPref = sspp.getString("stonerview_speed", "1"); // key
+        String hack = "stonerview";
+        nativeSettings(hack, hackPref, 0);
+    }
+
+
+
+    static
+    {
+        System.loadLibrary ("xscreensaver");
+    }
+
+}
diff --git a/android/project/xscreensaver/src/org/jwz/xscreensaver/gen/SuperquadricsService.java b/android/project/xscreensaver/src/org/jwz/xscreensaver/gen/SuperquadricsService.java
new file mode 100644 (file)
index 0000000..a2f7951
--- /dev/null
@@ -0,0 +1,60 @@
+package org.jwz.xscreensaver.gen;
+
+import net.rbgrn.android.glwallpaperservice.*;
+import android.content.SharedPreferences;
+import org.jwz.xscreensaver.*;
+
+// Original code provided by Robert Green
+// http://www.rbgrn.net/content/354-glsurfaceview-adapted-3d-live-wallpapers
+public class SuperquadricsService extends GLWallpaperService {
+
+    SharedPreferences sp;
+
+    public SuperquadricsService() {
+        super();
+    }
+
+    @Override
+    public void onCreate() {
+        sp = ((XscreensaverApp)getApplication()).getThePrefs(SuperquadricsWallpaper.SHARED_PREFS_NAME);
+    }
+
+    public Engine onCreateEngine() {
+        MyEngine engine = new MyEngine();
+        return engine;
+    }
+
+    class MyEngine extends GLEngine {
+        SuperquadricsWallpaper renderer;
+        public MyEngine() {
+            super();
+            // handle prefs, other initialization
+            renderer = new SuperquadricsWallpaper();
+            setRenderer(renderer);
+            setRenderMode(RENDERMODE_CONTINUOUSLY);
+        }
+
+        public void onDestroy() {
+            super.onDestroy();
+            if (renderer != null) {
+                renderer.release(); // assuming yours has this method - it should!
+            }
+            renderer = null;
+        }
+
+        @Override
+        public void onVisibilityChanged(boolean visible) {
+            super.onVisibilityChanged(visible);
+            if (visible) {
+                renderer.doSP(sp);
+            }
+        }
+
+    }
+    static
+    {
+        System.loadLibrary ("xscreensaver");
+    }
+
+
+}
diff --git a/android/project/xscreensaver/src/org/jwz/xscreensaver/gen/SuperquadricsSettings.java b/android/project/xscreensaver/src/org/jwz/xscreensaver/gen/SuperquadricsSettings.java
new file mode 100644 (file)
index 0000000..867012b
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.jwz.xscreensaver.gen;
+
+import org.jwz.xscreensaver.R;
+
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.preference.PreferenceActivity;
+
+public class SuperquadricsSettings extends PreferenceActivity
+    implements SharedPreferences.OnSharedPreferenceChangeListener {
+
+    @Override
+    protected void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        getPreferenceManager().setSharedPreferencesName(
+            SuperquadricsWallpaper.SHARED_PREFS_NAME);
+        addPreferencesFromResource(R.xml.superquadrics_settings);
+        getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(
+            this);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+    }
+
+    @Override
+    protected void onDestroy() {
+        getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(
+            this);
+        super.onDestroy();
+    }
+
+    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
+                                          String key) {
+    }
+}
diff --git a/android/project/xscreensaver/src/org/jwz/xscreensaver/gen/SuperquadricsWallpaper.java b/android/project/xscreensaver/src/org/jwz/xscreensaver/gen/SuperquadricsWallpaper.java
new file mode 100644 (file)
index 0000000..0893f84
--- /dev/null
@@ -0,0 +1,50 @@
+package org.jwz.xscreensaver.gen;
+
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.opengles.GL10;
+
+import net.rbgrn.android.glwallpaperservice.*;
+import android.opengl.GLU;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import org.jwz.xscreensaver.*;
+
+public class SuperquadricsWallpaper extends ARenderer {
+
+    private static native void nativeSettings(String hack, String hackPref, int draw);
+    public static final String SHARED_PREFS_NAME="superquadricssettings";
+    CallNative cn;
+
+    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
+
+        super.onSurfaceCreated(gl, config);
+
+        cn = new CallNative();
+        NonSurfaceCreated();
+    }
+
+    public void onDrawFrame(GL10 gl) {
+        super.onDrawFrame(gl);
+        nativeSettings("bogus", "bogus", 1);
+        NonDrawFrame();
+    }
+
+    void NonDrawFrame() {
+        cn.nativeRender();
+    }
+
+    void doSP(SharedPreferences sspp) {
+        String hackPref = sspp.getString("superquadrics_speed", "5"); // key
+        String hack = "superquadrics";
+        nativeSettings(hack, hackPref, 0);
+    }
+
+
+
+    static
+    {
+        System.loadLibrary ("xscreensaver");
+    }
+
+}
index 8ab437505246fe2306fb2ea8d1b173dd625be80d..3524ec4fc9a172a263eed360ed7dfbad41f6306a 100644 (file)
@@ -85,6 +85,9 @@
    (gdk-pixbuf 2.12). */
 #undef HAVE_GDK_PIXBUF_APPLY_EMBEDDED_ORIENTATION
 
+/* Define to 1 if you have the `getaddrinfo' function. */
+#undef HAVE_GETADDRINFO
+
 /* Define to 1 if you have the `getcwd' function. */
 #undef HAVE_GETCWD
 
 /* Define to 1 if you have the `realpath' function. */
 #undef HAVE_REALPATH
 
+/* Define this to enable recording of videos. */
+#undef HAVE_RECORD_ANIM
+
 /* Define to 1 if you have the `sbrk' function. */
 #undef HAVE_SBRK
 
 /* Define to 1 if you have the <string.h> header file. */
 #undef HAVE_STRING_H
 
+/* Define to 1 if `sa_len' is a member of `struct sockaddr'. */
+#undef HAVE_STRUCT_SOCKADDR_SA_LEN
+
 /* Define to 1 if you have the `syslog' function. */
 #undef HAVE_SYSLOG
 
    XF86VidMode[GS]etGamma(). These appeared in XFree86 4.1.0. */
 #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.) */
 #undef HAVE_XHPDISABLERESET
 /* Define this if you have the X Shared Memory Extension. */
 #undef HAVE_XSHM_EXTENSION
 
+/* Define this if you have the function Xutf8DrawString(). */
+#undef HAVE_XUTF8DRAWSTRING
+
 /* Define this to remove the option of locking the screen at all. */
 #undef NO_LOCKING
 
index 7e32db7b2dc890a2753382dd5f5c61ac395f7914..4e8a6d12ea5a564085e0efe58e9f18e5826be842 100755 (executable)
--- a/configure
+++ b/configure
@@ -625,6 +625,8 @@ DEPEND_DEFINES
 DEPEND_FLAGS
 DEPEND
 APPDEFAULTS
+ANIM_LIBS
+ANIM_OBJS
 GTK_EXTRA_OBJS
 HACK_CONF_DIR
 PO_DATADIR
@@ -649,6 +651,9 @@ LOCK_SRCS
 SAVER_GL_LIBS
 SAVER_GL_OBJS
 SAVER_GL_SRCS
+XFT_LIBS
+XFT_OBJS
+XFT_SRCS
 XMU_LIBS
 XMU_OBJS
 XMU_SRCS
@@ -846,6 +851,7 @@ with_gles
 with_pixbuf
 with_xpm
 with_jpeg
+with_xft
 with_xshm_ext
 with_xdbe_ext
 with_readdisplay
@@ -853,6 +859,7 @@ with_image_directory
 with_text_file
 with_browser
 with_setuid_hacks
+with_record_animation
 '
       ac_precious_vars='build_alias
 host_alias
@@ -1542,6 +1549,7 @@ Graphics options:
   --with-xpm              Include support for XPM files in some demos.
                           (Not needed if Pixbuf is used.)
   --with-jpeg             Include support for the JPEG library.
+  --with-xft              Include support for the X Freetype library.
   --with-xshm-ext         Include support for the Shared Memory extension.
   --with-xdbe-ext         Include support for the DOUBLE-BUFFER extension.
   --with-readdisplay      Include support for the XReadDisplay extension.
@@ -1552,6 +1560,8 @@ Graphics options:
   --with-setuid-hacks     Allow some demos to be installed `setuid root'
                           (which is needed in order to ping other hosts.)
 
+  --with-record-animation Include code for generating MP4 videos.
+
 
 Some influential environment variables:
   CC          C compiler command
@@ -2045,6 +2055,63 @@ $as_echo "$ac_res" >&6; }
   eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
 
 } # ac_fn_c_check_func
+
+# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES
+# ----------------------------------------------------
+# Tries to find if the field MEMBER exists in type AGGR, after including
+# INCLUDES, setting cache variable VAR accordingly.
+ac_fn_c_check_member ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
+$as_echo_n "checking for $2.$3... " >&6; }
+if eval \${$4+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$5
+int
+main ()
+{
+static $2 ac_aggr;
+if (ac_aggr.$3)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$4=yes"
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$5
+int
+main ()
+{
+static $2 ac_aggr;
+if (sizeof ac_aggr.$3)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$4=yes"
+else
+  eval "$4=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$4
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_member
 cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
@@ -2546,6 +2613,12 @@ echo "command line was: $0 $@"
 
 
 
+
+
+
+
+
+
 
 
 
@@ -5800,6 +5873,28 @@ _ACEOF
 fi
 done
 
+for ac_func in getaddrinfo
+do :
+  ac_fn_c_check_func "$LINENO" "getaddrinfo" "ac_cv_func_getaddrinfo"
+if test "x$ac_cv_func_getaddrinfo" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_GETADDRINFO 1
+_ACEOF
+
+fi
+done
+
+ac_fn_c_check_member "$LINENO" "struct sockaddr" "sa_len" "ac_cv_member_struct_sockaddr_sa_len" "#include <sys/socket.h>
+"
+if test "x$ac_cv_member_struct_sockaddr_sa_len" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_SOCKADDR_SA_LEN 1
+_ACEOF
+
+
+fi
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct icmp" >&5
 $as_echo_n "checking for struct icmp... " >&6; }
 if ${ac_cv_have_icmp+:} false; then :
@@ -6727,24 +6822,10 @@ $as_echo_n "checking for X app-defaults directory... " >&6; }
 if ${ac_cv_x_app_defaults+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-
-  rm -fr conftestdir
-  if mkdir conftestdir; then
-    cd conftestdir 2>/dev/null
-    # Make sure to not put "make" in the Imakefile rules, since we grep it out.
-    cat > Imakefile <<'EOF'
-acfindx:
-       @echo 'ac_x_app_defaults="${XAPPLOADDIR}"'
-EOF
-    if (xmkmf) >/dev/null 2>&1 && test -f Makefile; then
-      # GNU make sometimes prints "make[1]: Entering...", which'd confuse us.
-      eval `${MAKE-make} acfindx 2>/dev/null | grep -v make`
-    fi
-    cd .. 2>/dev/null
-    rm -fr conftestdir
-  fi
+  # skip this, it's always wrong these days.
+      #  AC_PATH_X_APP_DEFAULTS_XMKMF
       if test x"$ac_x_app_defaults" = x; then
-
+        true
   # Look for the directory under a standard set of common directories.
   # Check X11 before X11Rn because it's often a symlink to the current release.
   for ac_dir in                                 \
@@ -6761,6 +6842,8 @@ EOF
     /usr/lib/X11R5/app-defaults                 \
     /usr/lib/X11R4/app-defaults                 \
                                                 \
+    /etc/X11/app-defaults                       \
+                                                \
     /usr/local/X11/lib/app-defaults             \
     /usr/local/X11R6/lib/app-defaults           \
     /usr/local/X11R5/lib/app-defaults           \
@@ -6804,6 +6887,7 @@ EOF
 
       fi
       if test x"$ac_x_app_defaults" = x; then
+        /bin/echo -n 'fallback: '
         ac_cv_x_app_defaults="/usr/lib/X11/app-defaults"
       else
         # Record where we found app-defaults for the cache.
@@ -13119,7 +13203,7 @@ if ${ac_cv_mesagl_version_string+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 13126 "configure"
+#line 13210 "configure"
 #include "confdefs.h"
 #include <GL/gl.h>
 #ifndef MESA_MAJOR_VERSION
 fi
 
 
+###############################################################################
+#
+#       Check for -lXft
+#
+###############################################################################
+
+have_xutf8drawstring=no
+
+  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 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.  */
+
+/* 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 ()
+{
+return Xutf8DrawString ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_X11_Xutf8DrawString=yes
+else
+  ac_cv_lib_X11_Xutf8DrawString=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
+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
+
+
+have_xft=no
+with_xft_req=unspecified
+xft_halfassed=no
+
+# Check whether --with-xft was given.
+if test "${with_xft+set}" = set; then :
+  withval=$with_xft; with_xft="$withval"; with_xft_req="$withval"
+else
+  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"
+
+  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
+{ $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
+  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
+
+  ac_xft_config_cflags=$ac_cv_xft_config_cflags
+  ac_xft_config_libs=$ac_cv_xft_config_libs
+
+  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"
+
+    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"
+
+  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.  */
+
+/* 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
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  LDFLAGS="$ac_save_LDFLAGS"
+#  LIBS="$ac_save_LIBS"
+
+  fi
+
+  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_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
+
+else
+  XFT_LIBS=''
+  XFT_SRCS='$(UTILS_SRC)/xft.c'
+  XFT_OBJS='$(UTILS_BIN)/xft.o'
+fi
+
+
 ###############################################################################
 #
 #       Check for pty support: this allows 'phosphor' and 'apple2'
@@ -15193,6 +15566,88 @@ elif test "$setuid_hacks" != no; then
 fi
 
 
+###############################################################################
+#
+#       Check for --with-record-animation
+#
+###############################################################################
+
+record_anim_default=no
+record_anim="$record_anim_default"
+
+# Check whether --with-record-animation was given.
+if test "${with_record_animation+set}" = set; then :
+  withval=$with_record_animation; record_anim="$withval"
+else
+  record_anim="$record_anim_default"
+fi
+
+
+
+   case "$record_anim" in
+    yes) ;;
+    no)  ;;
+
+    /*)
+     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for record animation headers" >&5
+$as_echo_n "checking for record animation headers... " >&6; }
+     d=$record_anim/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 record animation libs" >&5
+$as_echo_n "checking for record animation libs... " >&6; }
+     d=$record_anim/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".
+     record_anim_req="yes"
+     record_anim=$record_anim_req
+     ;;
+
+    *)
+     echo ""
+     echo "error: argument to --with-record-animation 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 "$record_anim" = yes; then
+  true
+elif test "$record_anim" != no; then
+  echo "error: must be yes or no: --with-record-animation=$record_anim"
+  exit 1
+fi
+
+if test "$record_anim" = yes; then
+  if test "$have_gdk_pixbuf" != yes; then
+    as_fn_error $? "--with-record-animation requires GDK-Pixbuf" "$LINENO" 5
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabling --with-record-animation" >&5
+$as_echo "enabling --with-record-animation" >&6; }
+    $as_echo "#define HAVE_RECORD_ANIM 1" >>confdefs.h
+
+    ANIM_OBJS='$(ANIM_OBJS)'
+    ANIM_LIBS='$(ANIM_LIBS)'
+  fi
+fi
+
 ###############################################################################
 #
 #       Done testing.  Now, set up the various -I and -L variables,
@@ -15430,6 +15885,11 @@ INCLUDES=`echo "$INCLUDES" | sed 's@ -I${prefix}/include@@g;'`
 
 
 
+
+
+
+
+
 
 
 
@@ -17068,6 +17528,28 @@ if test "$have_jpeg" = no ; then
 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."
+fi
+
+
 if test "$have_gl" = yes -a "$ac_have_mesa_gl" = yes ; then
   preferred_mesagl=3.4
   mgv="$ac_mesagl_version_string"
index 25b827c5b425f4743d7fbee2b31cc93df21d51c0..1f68445fd54342997605c05deccc8298b355caaa 100644 (file)
@@ -169,6 +169,12 @@ AH_TEMPLATE([HAVE_XMU],
            of X, and if your vendor doesn't ship it, you should report that
            as a bug.])
 
+AH_TEMPLATE([HAVE_XUTF8DRAWSTRING],
+           [Define this if you have the function Xutf8DrawString().])
+
+AH_TEMPLATE([HAVE_XFT],
+           [Define this if you have libXft2.])
+
 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
@@ -317,6 +323,9 @@ AH_TEMPLATE([XPointer],
 AH_TEMPLATE([HAVE_PTHREAD],
            [Define this if your system supports POSIX threads.])
 
+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,
 # to make sure everything is here.
@@ -812,6 +821,8 @@ AC_DEFUN([AC_PATH_X_APP_DEFAULTS_DIRECT],[
     /usr/lib/X11R5/app-defaults                 \
     /usr/lib/X11R4/app-defaults                 \
                                                 \
+    /etc/X11/app-defaults                       \
+                                                \
     /usr/local/X11/lib/app-defaults             \
     /usr/local/X11R6/lib/app-defaults           \
     /usr/local/X11R5/lib/app-defaults           \
@@ -857,11 +868,13 @@ AC_DEFUN([AC_PATH_X_APP_DEFAULTS_DIRECT],[
 AC_DEFUN([AC_PATH_X_APP_DEFAULTS],
   [AC_REQUIRE_CPP()
     AC_CACHE_CHECK([for X app-defaults directory], ac_cv_x_app_defaults,
-     [AC_PATH_X_APP_DEFAULTS_XMKMF
+     [# skip this, it's always wrong these days.
+      #  AC_PATH_X_APP_DEFAULTS_XMKMF
       if test x"$ac_x_app_defaults" = x; then
-        AC_PATH_X_APP_DEFAULTS_DIRECT
+        true AC_PATH_X_APP_DEFAULTS_DIRECT
       fi
       if test x"$ac_x_app_defaults" = x; then
+        /bin/echo -n 'fallback: '
         ac_cv_x_app_defaults="/usr/lib/X11/app-defaults"
       else
         # Record where we found app-defaults for the cache.
@@ -1233,6 +1246,8 @@ AC_SYS_LARGEFILE
 AC_CHECK_FUNCS(select fcntl uname nice setpriority getcwd getwd putenv sbrk)
 AC_CHECK_FUNCS(sigaction syslog realpath setrlimit)
 AC_CHECK_FUNCS(setlocale)
+AC_CHECK_FUNCS(getaddrinfo)
+AC_CHECK_MEMBERS([struct sockaddr.sa_len],,, [[#include <sys/socket.h>]])
 AC_CHECK_ICMP
 AC_CHECK_ICMPHDR
 AC_CHECK_GETIFADDRS
@@ -3399,6 +3414,94 @@ if test "$with_jpeg" = yes; then
 fi
 
 
+###############################################################################
+#
+#       Check for -lXft
+#
+###############################################################################
+
+have_xutf8drawstring=no
+AC_CHECK_X_LIB(X11, Xutf8DrawString,
+               [have_xutf8drawstring=yes],
+               [true], -lX11 -lXext -lm)
+if test "$have_xutf8drawstring" = yes ; then
+  AC_DEFINE(HAVE_XUTF8DRAWSTRING)
+fi
+
+
+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="$withval"; with_xft_req="$withval"],
+  [with_xft=yes])
+
+HANDLE_X_PATH_ARG(with_xft, --with-xft, Xft)
+
+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"
+
+  if test "$have_xft" = yes; then
+    AC_CACHE_CHECK([for Xft includes], ac_cv_xft_config_cflags,
+               [ac_cv_xft_config_cflags=`$pkg_config --cflags $pkgs`])
+    AC_CACHE_CHECK([for Xft libs], ac_cv_xft_config_libs,
+               [ac_cv_xft_config_libs=`$pkg_config --libs $pkgs`])
+  fi
+
+  ac_xft_config_cflags=$ac_cv_xft_config_cflags
+  ac_xft_config_libs=$ac_cv_xft_config_libs
+
+  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"
+
+    have_xft=no
+    AC_CHECK_X_HEADER(X11/Xft/Xft.h, [have_xft=yes])
+
+    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
+
+    AC_MSG_RESULT(checking for Xft usability...)
+    AC_CHECK_X_LIB(c, XftDrawStringUtf8, [have_xft=yes],,
+                   $ac_xft_config_libs -lX11 -lXext -lm)
+  fi
+
+  if test "$have_xft" = no; then
+    AC_MSG_RESULT(checking for Xft usability... no)
+  fi
+fi
+
+if test "$have_xft" = yes; then
+  INCLUDES="$INCLUDES $ac_xft_config_cflags"
+  XFT_LIBS="$ac_xft_config_libs"
+  XFT_SRCS=''
+  XFT_OBJS=''
+  AC_DEFINE(HAVE_XFT)
+else
+  XFT_LIBS=''
+  XFT_SRCS='$(UTILS_SRC)/xft.c'
+  XFT_OBJS='$(UTILS_BIN)/xft.o'
+fi
+
+
 ###############################################################################
 #
 #       Check for pty support: this allows 'phosphor' and 'apple2'
@@ -3737,6 +3840,39 @@ elif test "$setuid_hacks" != no; then
 fi
 
 
+###############################################################################
+#
+#       Check for --with-record-animation
+#
+###############################################################################
+
+record_anim_default=no
+record_anim="$record_anim_default"
+AC_ARG_WITH(record-animation,
+[  --with-record-animation Include code for generating MP4 videos.
+],
+  [record_anim="$withval"], [record_anim="$record_anim_default"])
+
+HANDLE_X_PATH_ARG(record_anim, --with-record-animation, record animation)
+
+if test "$record_anim" = yes; then
+  true
+elif test "$record_anim" != no; then
+  echo "error: must be yes or no: --with-record-animation=$record_anim"
+  exit 1
+fi
+
+if test "$record_anim" = yes; then
+  if test "$have_gdk_pixbuf" != yes; then
+    AC_MSG_ERROR(--with-record-animation requires GDK-Pixbuf)
+  else
+    AC_MSG_RESULT(enabling --with-record-animation)
+    AC_DEFINE(HAVE_RECORD_ANIM)
+    ANIM_OBJS='$(ANIM_OBJS)'
+    ANIM_LIBS='$(ANIM_LIBS)'
+  fi
+fi
+
 ###############################################################################
 #
 #       Done testing.  Now, set up the various -I and -L variables,
@@ -3953,6 +4089,9 @@ 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)
@@ -3977,6 +4116,8 @@ AC_SUBST(GTK_DATADIR)
 AC_SUBST(PO_DATADIR)
 AC_SUBST(HACK_CONF_DIR)
 AC_SUBST(GTK_EXTRA_OBJS)
+AC_SUBST(ANIM_OBJS)
+AC_SUBST(ANIM_LIBS)
 
 APPDEFAULTS=$ac_x_app_defaults
 AC_SUBST(APPDEFAULTS)
@@ -4286,6 +4427,28 @@ if test "$have_jpeg" = no ; then
 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."
+fi
+
+
 if test "$have_gl" = yes -a "$ac_have_mesa_gl" = yes ; then
   preferred_mesagl=3.4
   mgv="$ac_mesagl_version_string"
index 2c22ac8556072b2a857df905af831e3d5ba82ed9..c1323048c85ac9828a0a555e93f29b96bdc1b3d1 100644 (file)
@@ -237,7 +237,7 @@ MEN         = $(MEN_1) @MEN_OSX@
 
 EXTRAS         = README Makefile.in \
                  XScreenSaver.ad.in XScreenSaver-Xm.ad xscreensaver.pam.in \
-                 xscreensaver-demo.glade2 xscreensaver-demo.glade2p \
+                 xscreensaver-demo.glade2.in xscreensaver-demo.glade2p \
                  screensaver-properties.desktop.in \
                  .gdbinit
 VMSFILES       = compile_axp.com compile_decc.com link_axp.com link_decc.com \
index d320002c0fd69994d7e9a38fd57923589788c0f8..d1bbbe3ac6a46b5728bf6c15062ad86d9e9a8dd1 100644 (file)
@@ -4,8 +4,8 @@
 !            a screen saver and locker for the X window system
 !                            by Jamie Zawinski
 !
-!                              version 5.30
-!                              10-Sep-2014
+!                              version 5.31
+!                              15-Nov-2014
 !
 ! See "man xscreensaver" for more info.  The latest version is always
 ! available at http://www.jwz.org/xscreensaver/
@@ -216,7 +216,7 @@ GetViewPortIsFullOfLies: False
                                distort -root                               \n\
                                epicycle -root                              \n\
                                flow -root                                  \n\
-- GL:                          glplanet -root                              \n\
+@GL_KLUDGE@ GL:                                glplanet -root                              \n\
                                interference -root                          \n\
                                kumppa -root                                \n\
 @GL_KLUDGE@ GL:                                lament -root                                \n\
@@ -311,7 +311,7 @@ GetViewPortIsFullOfLies: False
                                popsquares -root                            \n\
 @GL_KLUDGE@ GL:                                surfaces -root                              \n\
                                xanalogtv -root                             \n\
--                              abstractile -root                           \n\
+                               abstractile -root                           \n\
                                anemotaxis -root                            \n\
 - GL:                          antinspect -root                            \n\
                                fireworkx -root                             \n\
@@ -362,6 +362,9 @@ GetViewPortIsFullOfLies: False
 @GL_KLUDGE@ GL:                                kaleidocycle -root                          \n\
 @GL_KLUDGE@ GL:                                quasicrystal -root                          \n\
 @GL_KLUDGE@ GL:                                unknownpleasures -root                      \n\
+                               binaryring -root                            \n\
+@GL_KLUDGE@ GL:                                cityflow -root                              \n\
+@GL_KLUDGE@ GL:                                geodesicgears -root                         \n\
 @GL_KLUDGE@ GL:                                projectiveplane -root                       \n\
                                tessellimage -root                          \n\
 @GL_KLUDGE@ GL:                                winduprobot -root                           \n
@@ -438,6 +441,7 @@ XScreenSaver.bourneShell:           /bin/sh
 *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
@@ -463,6 +467,7 @@ XScreenSaver.bourneShell:           /bin/sh
 *hacks.flyingtoasters.name: FlyingToasters
 *hacks.fontglide.name:      FontGlide
 *hacks.fuzzyflakes.name:    FuzzyFlakes
+*hacks.geodesicgears.name:  GeodesicGears
 *hacks.gflux.name:          GFlux
 *hacks.gleidescope.name:    Gleidescope
 *hacks.glforestfire.name:   GLForestFire
index 9c10fc011694b6f43b5e92cd9f481521d8f970f3..22eb2024ccc9f98f8c6ff1f64fb904b6875eb566 100644 (file)
                                distort -root                               \\n\
                                epicycle -root                              \\n\
                                flow -root                                  \\n\
-- GL:                          glplanet -root                              \\n\
+  GL:                          glplanet -root                              \\n\
                                interference -root                          \\n\
                                kumppa -root                                \\n\
   GL:                          lament -root                                \\n\
                                compass -root                               \\n\
                                deluxe -root                                \\n\
 -                              demon -root                                 \\n\
-- GL:                          extrusion -root                             \\n\
+  GL:                          extrusion -root                             \\n\
 -                              loop -root                                  \\n\
                                penetrate -root                             \\n\
                                petri -root                                 \\n\
                                popsquares -root                            \\n\
   GL:                          surfaces -root                              \\n\
                                xanalogtv -root                             \\n\
--                              abstractile -root                           \\n\
+                               abstractile -root                           \\n\
                                anemotaxis -root                            \\n\
 - GL:                          antinspect -root                            \\n\
                                fireworkx -root                             \\n\
   GL:                          kaleidocycle -root                          \\n\
   GL:                          quasicrystal -root                          \\n\
   GL:                          unknownpleasures -root                      \\n\
+                               binaryring -root                            \\n\
+  GL:                          cityflow -root                              \\n\
+  GL:                          geodesicgears -root                         \\n\
   GL:                          projectiveplane -root                       \\n\
                                tessellimage -root                          \\n\
   GL:                          winduprobot -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.flyingtoasters.name: FlyingToasters",
 "*hacks.fontglide.name:      FontGlide",
 "*hacks.fuzzyflakes.name:    FuzzyFlakes",
+"*hacks.geodesicgears.name:  GeodesicGears",
 "*hacks.gflux.name:          GFlux",
 "*hacks.gleidescope.name:    Gleidescope",
 "*hacks.glforestfire.name:   GLForestFire",
index 2f03a12f04e20870e152ece5d6e37c8b9a54e31b..bac6ecc7539b4e1a984e5cbb86817c7d61181fc2 100644 (file)
@@ -1,5 +1,5 @@
 /* demo-Gtk-conf.c --- implements the dynamic configuration dialogs.
- * xscreensaver, Copyright (c) 2001-2013 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 2001-2014 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -300,7 +300,8 @@ make_parameter (const char *filename, xmlNodePtr node)
 
   else if (!strcmp (name, "xscreensaver-text") ||   /* ignored in X11; */
            !strcmp (name, "xscreensaver-image") ||  /* used in Cocoa. */
-           !strcmp (name, "xscreensaver-updater"))
+           !strcmp (name, "xscreensaver-updater") ||
+           !strcmp (name, "video"))
     {
       free (p);
       return 0;
@@ -1169,7 +1170,7 @@ de_stringify (char *s)
   char q = s[0];
   if (q != '\'' && q != '\"' && q != '`')
     abort();
-  memmove (s, s+1, strlen (s)+1);
+  memmove (s, s+1, strlen (s));
   while (*s && *s != q)
     {
       if (*s == '\\')
index 29edc82b66b1349fb3a3f6879a83fbd6f69ea4f6..52d56691cb5171e262900438a76a1986213286de 100644 (file)
@@ -1681,7 +1681,7 @@ blank_screen (saver_info *si)
   raise_window (si, False, False, False);
 
   si->screen_blanked_p = True;
-  si->blank_time = time ((time_t) 0);
+  si->blank_time = time ((time_t *) 0);
   si->last_wall_clock_time = 0;
 
   store_saver_status (si);  /* store blank time */
@@ -1803,7 +1803,7 @@ unblank_screen (saver_info *si)
     XUnmapWindow (si->dpy, si->screens[i].screensaver_window);
 
   si->screen_blanked_p = False;
-  si->blank_time = time ((time_t) 0);
+  si->blank_time = time ((time_t *) 0);
   si->last_wall_clock_time = 0;
 
   store_saver_status (si);  /* store unblank time */
diff --git a/driver/xscreensaver-demo.glade2.in b/driver/xscreensaver-demo.glade2.in
new file mode 100644 (file)
index 0000000..ad0095d
--- /dev/null
@@ -0,0 +1,3136 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
+
+<glade-interface>
+<requires lib="gnome"/>
+
+<widget class="GtkWindow" id="xscreensaver_demo">
+  <property name="title" translatable="yes">XScreenSaver</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+
+  <child>
+    <widget class="GtkVBox" id="outer_vbox">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">5</property>
+
+      <child>
+       <widget class="GtkMenuBar" id="menubar">
+         <property name="visible">True</property>
+         <property name="pack_direction">GTK_PACK_DIRECTION_LTR</property>
+         <property name="child_pack_direction">GTK_PACK_DIRECTION_LTR</property>
+
+         <child>
+           <widget class="GtkMenuItem" id="file">
+             <property name="visible">True</property>
+             <property name="label" translatable="yes">_File</property>
+             <property name="use_underline">True</property>
+             <signal name="activate" handler="file_menu_cb" last_modification_time="Sun, 06 Mar 2005 21:41:13 GMT"/>
+
+             <child>
+               <widget class="GtkMenu" id="file_menu">
+
+                 <child>
+                   <widget class="GtkMenuItem" id="activate_menu">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">_Blank Screen Now</property>
+                     <property name="use_underline">True</property>
+                     <signal name="activate" handler="activate_menu_cb"/>
+                   </widget>
+                 </child>
+
+                 <child>
+                   <widget class="GtkMenuItem" id="lock_menu">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">_Lock Screen Now</property>
+                     <property name="use_underline">True</property>
+                     <signal name="activate" handler="lock_menu_cb"/>
+                   </widget>
+                 </child>
+
+                 <child>
+                   <widget class="GtkMenuItem" id="kill_menu">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">_Kill Daemon</property>
+                     <property name="use_underline">True</property>
+                     <signal name="activate" handler="kill_menu_cb"/>
+                   </widget>
+                 </child>
+
+                 <child>
+                   <widget class="GtkMenuItem" id="restart">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">_Restart Daemon</property>
+                     <property name="use_underline">True</property>
+                     <signal name="activate" handler="restart_menu_cb"/>
+                   </widget>
+                 </child>
+
+                 <child>
+                   <widget class="GtkMenuItem" id="separator1">
+                     <property name="visible">True</property>
+                   </widget>
+                 </child>
+
+                 <child>
+                   <widget class="GtkMenuItem" id="exit_menu">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">_Quit</property>
+                     <property name="use_underline">True</property>
+                     <signal name="activate" handler="exit_menu_cb"/>
+                   </widget>
+                 </child>
+               </widget>
+             </child>
+           </widget>
+         </child>
+
+         <child>
+           <widget class="GtkMenuItem" id="help">
+             <property name="visible">True</property>
+             <property name="label" translatable="yes">_Help</property>
+             <property name="use_underline">True</property>
+
+             <child>
+               <widget class="GtkMenu" id="help_menu">
+
+                 <child>
+                   <widget class="GtkMenuItem" id="about_menu">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">_About...</property>
+                     <property name="use_underline">True</property>
+                     <signal name="activate" handler="about_menu_cb"/>
+                   </widget>
+                 </child>
+
+                 <child>
+                   <widget class="GtkMenuItem" id="doc_menu">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">_Documentation...</property>
+                     <property name="use_underline">True</property>
+                     <signal name="activate" handler="doc_menu_cb"/>
+                   </widget>
+                 </child>
+               </widget>
+             </child>
+           </widget>
+         </child>
+       </widget>
+       <packing>
+         <property name="padding">0</property>
+         <property name="expand">False</property>
+         <property name="fill">False</property>
+       </packing>
+      </child>
+
+      <child>
+       <widget class="GtkHBox" id="spacer_hbox">
+         <property name="border_width">8</property>
+         <property name="visible">True</property>
+         <property name="homogeneous">False</property>
+         <property name="spacing">0</property>
+
+         <child>
+           <widget class="GtkNotebook" id="notebook">
+             <property name="visible">True</property>
+             <property name="can_focus">True</property>
+             <property name="show_tabs">True</property>
+             <property name="show_border">True</property>
+             <property name="tab_pos">GTK_POS_TOP</property>
+             <property name="scrollable">False</property>
+             <property name="enable_popup">False</property>
+             <signal name="switch_page" handler="switch_page_cb"/>
+
+             <child>
+               <widget class="GtkTable" id="demos_table">
+                 <property name="border_width">10</property>
+                 <property name="visible">True</property>
+                 <property name="n_rows">2</property>
+                 <property name="n_columns">2</property>
+                 <property name="homogeneous">False</property>
+                 <property name="row_spacing">0</property>
+                 <property name="column_spacing">0</property>
+
+                 <child>
+                   <widget class="GtkTable" id="blanking_table">
+                     <property name="visible">True</property>
+                     <property name="n_rows">3</property>
+                     <property name="n_columns">4</property>
+                     <property name="homogeneous">False</property>
+                     <property name="row_spacing">2</property>
+                     <property name="column_spacing">0</property>
+
+                     <child>
+                       <widget class="GtkLabel" id="cycle_label">
+                         <property name="visible">True</property>
+                         <property name="label" translatable="yes">_Cycle After</property>
+                         <property name="use_underline">True</property>
+                         <property name="use_markup">False</property>
+                         <property name="justify">GTK_JUSTIFY_RIGHT</property>
+                         <property name="wrap">False</property>
+                         <property name="selectable">False</property>
+                         <property name="xalign">1</property>
+                         <property name="yalign">0.5</property>
+                         <property name="xpad">8</property>
+                         <property name="ypad">0</property>
+                         <property name="mnemonic_widget">cycle_spinbutton</property>
+                         <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                         <property name="width_chars">-1</property>
+                         <property name="single_line_mode">False</property>
+                         <property name="angle">0</property>
+                         <accessibility>
+                           <atkrelation target="cycle_spinbutton" type="label-for"/>
+                           <atkrelation target="cycle_spinbutton" type="flows-to"/>
+                         </accessibility>
+                       </widget>
+                       <packing>
+                         <property name="left_attach">1</property>
+                         <property name="right_attach">2</property>
+                         <property name="top_attach">1</property>
+                         <property name="bottom_attach">2</property>
+                         <property name="x_options">fill</property>
+                         <property name="y_options"></property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkEventBox" id="lock_button_eventbox">
+                         <property name="visible">True</property>
+                         <property name="tooltip" translatable="yes">Whether a password should be required to un-blank the screen.</property>
+                         <property name="visible_window">True</property>
+                         <property name="above_child">False</property>
+
+                         <child>
+                           <widget class="GtkCheckButton" id="lock_button">
+                             <property name="visible">True</property>
+                             <property name="can_focus">True</property>
+                             <property name="label" translatable="yes">_Lock Screen After  </property>
+                             <property name="use_underline">True</property>
+                             <property name="relief">GTK_RELIEF_NORMAL</property>
+                             <property name="focus_on_click">True</property>
+                             <property name="active">False</property>
+                             <property name="inconsistent">False</property>
+                             <property name="draw_indicator">True</property>
+                             <accessibility>
+                               <atkproperty name="AtkObject::accessible_name" translatable="yes">Lock Screen</atkproperty>
+                               <atkrelation target="lock_spinbutton" type="controller-for"/>
+                               <atkrelation target="lock_spinbutton" type="label-for"/>
+                               <atkrelation target="lock_spinbutton" type="flows-to"/>
+                             </accessibility>
+                             <signal name="toggled" handler="pref_changed_cb"/>
+                           </widget>
+                         </child>
+                       </widget>
+                       <packing>
+                         <property name="left_attach">0</property>
+                         <property name="right_attach">2</property>
+                         <property name="top_attach">2</property>
+                         <property name="bottom_attach">3</property>
+                         <property name="x_options">fill</property>
+                         <property name="y_options"></property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkSpinButton" id="timeout_spinbutton">
+                         <property name="visible">True</property>
+                         <property name="tooltip" translatable="yes">How long before the screen saver activates.</property>
+                         <property name="can_focus">True</property>
+                         <property name="climb_rate">15</property>
+                         <property name="digits">0</property>
+                         <property name="numeric">True</property>
+                         <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+                         <property name="snap_to_ticks">True</property>
+                         <property name="wrap">False</property>
+                         <property name="adjustment">1 1 720 1 15 0</property>
+                         <accessibility>
+                           <atkrelation target="timeout_label" type="labelled-by"/>
+                           <atkrelation target="timeout_mlabel" type="labelled-by"/>
+                           <atkrelation target="timeout_label" type="flows-from"/>
+                           <atkrelation target="timeout_mlabel" type="flows-to"/>
+                         </accessibility>
+                         <signal name="activate" handler="pref_changed_cb"/>
+                         <signal name="focus_out_event" handler="pref_changed_event_cb"/>
+                         <signal name="value_changed" handler="pref_changed_cb"/>
+                       </widget>
+                       <packing>
+                         <property name="left_attach">2</property>
+                         <property name="right_attach">3</property>
+                         <property name="top_attach">0</property>
+                         <property name="bottom_attach">1</property>
+                         <property name="x_options">fill</property>
+                         <property name="y_options"></property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkSpinButton" id="lock_spinbutton">
+                         <property name="visible">True</property>
+                         <property name="tooltip" translatable="yes">How long after the screen blanks until a password will be required.</property>
+                         <property name="can_focus">True</property>
+                         <property name="climb_rate">15</property>
+                         <property name="digits">0</property>
+                         <property name="numeric">True</property>
+                         <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+                         <property name="snap_to_ticks">True</property>
+                         <property name="wrap">False</property>
+                         <property name="adjustment">0 0 720 1 15 0</property>
+                         <accessibility>
+                           <atkproperty name="AtkObject::accessible_name" translatable="yes">Lock Screen After</atkproperty>
+                           <atkrelation target="lock_button" type="controlled-by"/>
+                           <atkrelation target="lock_button" type="labelled-by"/>
+                           <atkrelation target="lock_mlabel" type="labelled-by"/>
+                           <atkrelation target="lock_button" type="flows-from"/>
+                           <atkrelation target="lock_mlabel" type="flows-to"/>
+                         </accessibility>
+                         <signal name="activate" handler="pref_changed_cb"/>
+                         <signal name="focus_out_event" handler="pref_changed_event_cb"/>
+                         <signal name="value_changed" handler="pref_changed_cb"/>
+                       </widget>
+                       <packing>
+                         <property name="left_attach">2</property>
+                         <property name="right_attach">3</property>
+                         <property name="top_attach">2</property>
+                         <property name="bottom_attach">3</property>
+                         <property name="y_padding">10</property>
+                         <property name="x_options">fill</property>
+                         <property name="y_options"></property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkSpinButton" id="cycle_spinbutton">
+                         <property name="visible">True</property>
+                         <property name="tooltip" translatable="yes">How long each display mode should run before choosing a new one (in Random mode.)</property>
+                         <property name="can_focus">True</property>
+                         <property name="climb_rate">15</property>
+                         <property name="digits">0</property>
+                         <property name="numeric">True</property>
+                         <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+                         <property name="snap_to_ticks">True</property>
+                         <property name="wrap">False</property>
+                         <property name="adjustment">0 0 720 1 15 0</property>
+                         <accessibility>
+                           <atkrelation target="cycle_label" type="labelled-by"/>
+                           <atkrelation target="cycle_mlabel" type="labelled-by"/>
+                           <atkrelation target="cycle_label" type="flows-from"/>
+                           <atkrelation target="cycle_mlabel" type="flows-to"/>
+                         </accessibility>
+                         <signal name="activate" handler="pref_changed_cb"/>
+                         <signal name="focus_out_event" handler="pref_changed_event_cb"/>
+                         <signal name="value_changed" handler="pref_changed_cb"/>
+                       </widget>
+                       <packing>
+                         <property name="left_attach">2</property>
+                         <property name="right_attach">3</property>
+                         <property name="top_attach">1</property>
+                         <property name="bottom_attach">2</property>
+                         <property name="x_options">fill</property>
+                         <property name="y_options"></property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkLabel" id="lock_mlabel">
+                         <property name="visible">True</property>
+                         <property name="label" translatable="yes">minutes</property>
+                         <property name="use_underline">False</property>
+                         <property name="use_markup">False</property>
+                         <property name="justify">GTK_JUSTIFY_LEFT</property>
+                         <property name="wrap">False</property>
+                         <property name="selectable">False</property>
+                         <property name="xalign">0</property>
+                         <property name="yalign">0.5</property>
+                         <property name="xpad">8</property>
+                         <property name="ypad">0</property>
+                         <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                         <property name="width_chars">-1</property>
+                         <property name="single_line_mode">False</property>
+                         <property name="angle">0</property>
+                         <accessibility>
+                           <atkrelation target="lock_spinbutton" type="label-for"/>
+                           <atkrelation target="lock_spinbutton" type="flows-to"/>
+                         </accessibility>
+                       </widget>
+                       <packing>
+                         <property name="left_attach">3</property>
+                         <property name="right_attach">4</property>
+                         <property name="top_attach">2</property>
+                         <property name="bottom_attach">3</property>
+                         <property name="y_options"></property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkLabel" id="cycle_mlabel">
+                         <property name="visible">True</property>
+                         <property name="label" translatable="yes">minutes</property>
+                         <property name="use_underline">False</property>
+                         <property name="use_markup">False</property>
+                         <property name="justify">GTK_JUSTIFY_LEFT</property>
+                         <property name="wrap">False</property>
+                         <property name="selectable">False</property>
+                         <property name="xalign">0</property>
+                         <property name="yalign">0.5</property>
+                         <property name="xpad">8</property>
+                         <property name="ypad">0</property>
+                         <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                         <property name="width_chars">-1</property>
+                         <property name="single_line_mode">False</property>
+                         <property name="angle">0</property>
+                         <accessibility>
+                           <atkrelation target="cycle_spinbutton" type="label-for"/>
+                           <atkrelation target="cycle_spinbutton" type="flows-from"/>
+                         </accessibility>
+                       </widget>
+                       <packing>
+                         <property name="left_attach">3</property>
+                         <property name="right_attach">4</property>
+                         <property name="top_attach">1</property>
+                         <property name="bottom_attach">2</property>
+                         <property name="y_options"></property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkLabel" id="timeout_label">
+                         <property name="visible">True</property>
+                         <property name="label" translatable="yes">_Blank After</property>
+                         <property name="use_underline">True</property>
+                         <property name="use_markup">False</property>
+                         <property name="justify">GTK_JUSTIFY_RIGHT</property>
+                         <property name="wrap">False</property>
+                         <property name="selectable">False</property>
+                         <property name="xalign">1</property>
+                         <property name="yalign">0.5</property>
+                         <property name="xpad">8</property>
+                         <property name="ypad">0</property>
+                         <property name="mnemonic_widget">timeout_spinbutton</property>
+                         <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                         <property name="width_chars">-1</property>
+                         <property name="single_line_mode">False</property>
+                         <property name="angle">0</property>
+                         <accessibility>
+                           <atkrelation target="timeout_spinbutton" type="label-for"/>
+                           <atkrelation target="timeout_spinbutton" type="flows-to"/>
+                         </accessibility>
+                       </widget>
+                       <packing>
+                         <property name="left_attach">1</property>
+                         <property name="right_attach">2</property>
+                         <property name="top_attach">0</property>
+                         <property name="bottom_attach">1</property>
+                         <property name="x_options">fill</property>
+                         <property name="y_options"></property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkLabel" id="timeout_mlabel">
+                         <property name="visible">True</property>
+                         <property name="label" translatable="yes">minutes</property>
+                         <property name="use_underline">False</property>
+                         <property name="use_markup">False</property>
+                         <property name="justify">GTK_JUSTIFY_LEFT</property>
+                         <property name="wrap">False</property>
+                         <property name="selectable">False</property>
+                         <property name="xalign">0</property>
+                         <property name="yalign">0.5</property>
+                         <property name="xpad">8</property>
+                         <property name="ypad">0</property>
+                         <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                         <property name="width_chars">-1</property>
+                         <property name="single_line_mode">False</property>
+                         <property name="angle">0</property>
+                         <accessibility>
+                           <atkrelation target="timeout_spinbutton" type="label-for"/>
+                           <atkrelation target="timeout_spinbutton" type="flows-from"/>
+                         </accessibility>
+                       </widget>
+                       <packing>
+                         <property name="left_attach">3</property>
+                         <property name="right_attach">4</property>
+                         <property name="top_attach">0</property>
+                         <property name="bottom_attach">1</property>
+                         <property name="y_options"></property>
+                       </packing>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="left_attach">0</property>
+                     <property name="right_attach">1</property>
+                     <property name="top_attach">1</property>
+                     <property name="bottom_attach">2</property>
+                     <property name="x_options">fill</property>
+                     <property name="y_options">fill</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkHButtonBox" id="demo_manual_hbbox">
+                     <property name="visible">True</property>
+                     <property name="layout_style">GTK_BUTTONBOX_SPREAD</property>
+                     <property name="spacing">30</property>
+
+                     <child>
+                       <widget class="GtkButton" id="demo">
+                         <property name="visible">True</property>
+                         <property name="tooltip" translatable="yes">Demo the selected screen saver in full-screen mode (click the mouse to return.)</property>
+                         <property name="can_default">True</property>
+                         <property name="can_focus">True</property>
+                         <property name="label" translatable="yes">_Preview</property>
+                         <property name="use_underline">True</property>
+                         <property name="relief">GTK_RELIEF_NORMAL</property>
+                         <property name="focus_on_click">True</property>
+                         <signal name="clicked" handler="run_this_cb"/>
+                       </widget>
+                     </child>
+
+                     <child>
+                       <widget class="GtkButton" id="settings">
+                         <property name="visible">True</property>
+                         <property name="tooltip" translatable="yes">Customization and explanation of the selected screen saver.</property>
+                         <property name="can_default">True</property>
+                         <property name="can_focus">True</property>
+                         <property name="label" translatable="yes">_Settings...</property>
+                         <property name="use_underline">True</property>
+                         <property name="relief">GTK_RELIEF_NORMAL</property>
+                         <property name="focus_on_click">True</property>
+                         <signal name="clicked" handler="settings_cb"/>
+                       </widget>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="left_attach">1</property>
+                     <property name="right_attach">2</property>
+                     <property name="top_attach">1</property>
+                     <property name="bottom_attach">2</property>
+                     <property name="x_options">fill</property>
+                     <property name="y_options">fill</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkVBox" id="list_vbox">
+                     <property name="border_width">10</property>
+                     <property name="visible">True</property>
+                     <property name="homogeneous">False</property>
+                     <property name="spacing">0</property>
+
+                     <child>
+                       <widget class="GtkHBox" id="mode_hbox">
+                         <property name="visible">True</property>
+                         <property name="homogeneous">False</property>
+                         <property name="spacing">0</property>
+
+                         <child>
+                           <widget class="GtkLabel" id="mode_label">
+                             <property name="visible">True</property>
+                             <property name="label" translatable="yes">_Mode:</property>
+                             <property name="use_underline">True</property>
+                             <property name="use_markup">False</property>
+                             <property name="justify">GTK_JUSTIFY_LEFT</property>
+                             <property name="wrap">False</property>
+                             <property name="selectable">False</property>
+                             <property name="xalign">0</property>
+                             <property name="yalign">0.5</property>
+                             <property name="xpad">0</property>
+                             <property name="ypad">0</property>
+                             <property name="mnemonic_widget">mode_menu</property>
+                             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                             <property name="width_chars">-1</property>
+                             <property name="single_line_mode">False</property>
+                             <property name="angle">0</property>
+                             <accessibility>
+                               <atkrelation target="mode_menu_popup" type="label-for"/>
+                             </accessibility>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">False</property>
+                             <property name="fill">False</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkOptionMenu" id="mode_menu">
+                             <property name="visible">True</property>
+                             <property name="can_focus">True</property>
+                             <property name="history">0</property>
+                             <accessibility>
+                               <atkrelation target="mode_label" type="labelled-by"/>
+                             </accessibility>
+
+                             <child internal-child="menu">
+                               <widget class="GtkMenu" id="mode_menu_popup">
+                                 <property name="visible">True</property>
+
+                                 <child>
+                                   <widget class="GtkMenuItem" id="disable_menuitem">
+                                     <property name="visible">True</property>
+                                     <property name="tooltip" translatable="yes">Never blank the screen or power down the monitor.</property>
+                                     <property name="label" translatable="yes">_Disable Screen Saver</property>
+                                     <property name="use_underline">True</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkMenuItem" id="blank_menuitem">
+                                     <property name="visible">True</property>
+                                     <property name="tooltip" translatable="yes">When idle or locked, blacken the screen only.</property>
+                                     <property name="label" translatable="yes">_Blank Screen Only</property>
+                                     <property name="use_underline">True</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkMenuItem" id="one_menuitem">
+                                     <property name="visible">True</property>
+                                     <property name="tooltip" translatable="yes">When idle or locked, run the display mode selected below.</property>
+                                     <property name="label" translatable="yes">_Only One Screen Saver</property>
+                                     <property name="use_underline">True</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkMenuItem" id="random_menuitem">
+                                     <property name="visible">True</property>
+                                     <property name="tooltip" translatable="yes">When idle or locked, choose a random display mode from among the checked items in the list below.</property>
+                                     <property name="label" translatable="yes">_Random Screen Saver</property>
+                                     <property name="use_underline">True</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkMenuItem" id="random_same_menuitem">
+                                     <property name="visible">True</property>
+                                     <property name="tooltip" translatable="yes">When idle or locked, choose a random display mode from among the checked items in the list below.  Run that same mode on each monitor.</property>
+                                     <property name="label" translatable="yes">_Same Random Savers</property>
+                                     <property name="use_underline">True</property>
+                                   </widget>
+                                 </child>
+                               </widget>
+                             </child>
+                           </widget>
+                           <packing>
+                             <property name="padding">4</property>
+                             <property name="expand">True</property>
+                             <property name="fill">True</property>
+                           </packing>
+                         </child>
+                       </widget>
+                       <packing>
+                         <property name="padding">10</property>
+                         <property name="expand">False</property>
+                         <property name="fill">True</property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkScrolledWindow" id="scroller">
+                         <property name="visible">True</property>
+                         <property name="can_focus">True</property>
+                         <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
+                         <property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
+                         <property name="shadow_type">GTK_SHADOW_IN</property>
+                         <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+                         <child>
+                           <widget class="GtkTreeView" id="list">
+                             <property name="visible">True</property>
+                             <property name="can_focus">True</property>
+                             <property name="headers_visible">False</property>
+                             <property name="rules_hint">True</property>
+                             <property name="reorderable">False</property>
+                             <property name="enable_search">True</property>
+                             <property name="fixed_height_mode">False</property>
+                             <property name="hover_selection">False</property>
+                             <property name="hover_expand">False</property>
+                           </widget>
+                         </child>
+                       </widget>
+                       <packing>
+                         <property name="padding">0</property>
+                         <property name="expand">True</property>
+                         <property name="fill">True</property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkHBox" id="centering_hbox">
+                         <property name="visible">True</property>
+                         <property name="homogeneous">True</property>
+                         <property name="spacing">0</property>
+
+                         <child>
+                           <widget class="GtkHBox" id="next_prev_hbox">
+                             <property name="visible">True</property>
+                             <property name="homogeneous">False</property>
+                             <property name="spacing">0</property>
+
+                             <child>
+                               <widget class="GtkButton" id="next">
+                                 <property name="visible">True</property>
+                                 <property name="tooltip" translatable="yes">Run the next screen saver in the list in full-screen mode (click the mouse to return.)</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
+                                 <signal name="clicked" handler="run_next_cb"/>
+
+                                 <child>
+                                   <widget class="GtkArrow" id="arrow1">
+                                     <property name="visible">True</property>
+                                     <property name="arrow_type">GTK_ARROW_DOWN</property>
+                                     <property name="shadow_type">GTK_SHADOW_OUT</property>
+                                     <property name="xalign">0.5</property>
+                                     <property name="yalign">0.5</property>
+                                     <property name="xpad">0</property>
+                                     <property name="ypad">0</property>
+                                   </widget>
+                                 </child>
+                               </widget>
+                               <packing>
+                                 <property name="padding">0</property>
+                                 <property name="expand">False</property>
+                                 <property name="fill">False</property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkButton" id="prev">
+                                 <property name="visible">True</property>
+                                 <property name="tooltip" translatable="yes">Run the previous screen saver in the list in full-screen mode (click the mouse to return.)</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
+                                 <signal name="clicked" handler="run_prev_cb"/>
+
+                                 <child>
+                                   <widget class="GtkArrow" id="arrow2">
+                                     <property name="visible">True</property>
+                                     <property name="arrow_type">GTK_ARROW_UP</property>
+                                     <property name="shadow_type">GTK_SHADOW_OUT</property>
+                                     <property name="xalign">0.5</property>
+                                     <property name="yalign">0.5</property>
+                                     <property name="xpad">0</property>
+                                     <property name="ypad">0</property>
+                                   </widget>
+                                 </child>
+                               </widget>
+                               <packing>
+                                 <property name="padding">0</property>
+                                 <property name="expand">False</property>
+                                 <property name="fill">False</property>
+                               </packing>
+                             </child>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">False</property>
+                             <property name="fill">False</property>
+                           </packing>
+                         </child>
+                       </widget>
+                       <packing>
+                         <property name="padding">0</property>
+                         <property name="expand">False</property>
+                         <property name="fill">True</property>
+                         <property name="pack_type">GTK_PACK_END</property>
+                       </packing>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="left_attach">0</property>
+                     <property name="right_attach">1</property>
+                     <property name="top_attach">0</property>
+                     <property name="bottom_attach">1</property>
+                     <property name="x_options">fill</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkFrame" id="preview_frame">
+                     <property name="visible">True</property>
+                     <property name="label_xalign">0</property>
+                     <property name="label_yalign">0.5</property>
+                     <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+                     <accessibility>
+                       <atkrelation target="label1" type="labelled-by"/>
+                     </accessibility>
+
+                     <child>
+                       <widget class="GtkNotebook" id="preview_notebook">
+                         <property name="visible">True</property>
+                         <property name="can_focus">True</property>
+                         <property name="show_tabs">True</property>
+                         <property name="show_border">False</property>
+                         <property name="tab_pos">GTK_POS_BOTTOM</property>
+                         <property name="scrollable">False</property>
+                         <property name="enable_popup">False</property>
+
+                         <child>
+                           <widget class="GtkAspectFrame" id="preview_aspectframe">
+                             <property name="border_width">8</property>
+                             <property name="visible">True</property>
+                             <property name="label_xalign">0</property>
+                             <property name="label_yalign">0.5</property>
+                             <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+                             <property name="xalign">0.5</property>
+                             <property name="yalign">0.5</property>
+                             <property name="ratio">1.33000004292</property>
+                             <property name="obey_child">False</property>
+
+                             <child>
+                               <widget class="GtkDrawingArea" id="preview">
+                                 <property name="visible">True</property>
+                               </widget>
+                             </child>
+                           </widget>
+                           <packing>
+                             <property name="tab_expand">False</property>
+                             <property name="tab_fill">True</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkLabel" id="preview_tab">
+                             <property name="visible">True</property>
+                             <property name="label" translatable="yes">preview</property>
+                             <property name="use_underline">False</property>
+                             <property name="use_markup">False</property>
+                             <property name="justify">GTK_JUSTIFY_LEFT</property>
+                             <property name="wrap">False</property>
+                             <property name="selectable">False</property>
+                             <property name="xalign">0.5</property>
+                             <property name="yalign">0.5</property>
+                             <property name="xpad">0</property>
+                             <property name="ypad">0</property>
+                             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                             <property name="width_chars">-1</property>
+                             <property name="single_line_mode">False</property>
+                             <property name="angle">0</property>
+                           </widget>
+                           <packing>
+                             <property name="type">tab</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkLabel" id="no_preview_label">
+                             <property name="visible">True</property>
+                             <property name="label" translatable="yes">No Preview
+Available</property>
+                             <property name="use_underline">False</property>
+                             <property name="use_markup">False</property>
+                             <property name="justify">GTK_JUSTIFY_CENTER</property>
+                             <property name="wrap">False</property>
+                             <property name="selectable">False</property>
+                             <property name="xalign">0.5</property>
+                             <property name="yalign">0.5</property>
+                             <property name="xpad">0</property>
+                             <property name="ypad">0</property>
+                             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                             <property name="width_chars">-1</property>
+                             <property name="single_line_mode">False</property>
+                             <property name="angle">0</property>
+                           </widget>
+                           <packing>
+                             <property name="tab_expand">False</property>
+                             <property name="tab_fill">True</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkLabel" id="no_preview_tab">
+                             <property name="visible">True</property>
+                             <property name="label" translatable="yes">no preview</property>
+                             <property name="use_underline">False</property>
+                             <property name="use_markup">False</property>
+                             <property name="justify">GTK_JUSTIFY_LEFT</property>
+                             <property name="wrap">False</property>
+                             <property name="selectable">False</property>
+                             <property name="xalign">0.5</property>
+                             <property name="yalign">0.5</property>
+                             <property name="xpad">0</property>
+                             <property name="ypad">0</property>
+                             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                             <property name="width_chars">-1</property>
+                             <property name="single_line_mode">False</property>
+                             <property name="angle">0</property>
+                           </widget>
+                           <packing>
+                             <property name="type">tab</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkLabel" id="not_installed_label">
+                             <property name="visible">True</property>
+                             <property name="label" translatable="yes">Not
+Installed</property>
+                             <property name="use_underline">False</property>
+                             <property name="use_markup">False</property>
+                             <property name="justify">GTK_JUSTIFY_CENTER</property>
+                             <property name="wrap">False</property>
+                             <property name="selectable">False</property>
+                             <property name="xalign">0.5</property>
+                             <property name="yalign">0.5</property>
+                             <property name="xpad">0</property>
+                             <property name="ypad">0</property>
+                             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                             <property name="width_chars">-1</property>
+                             <property name="single_line_mode">False</property>
+                             <property name="angle">0</property>
+                           </widget>
+                           <packing>
+                             <property name="tab_expand">False</property>
+                             <property name="tab_fill">True</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkLabel" id="not_installed_tab">
+                             <property name="visible">True</property>
+                             <property name="label" translatable="yes">not installed</property>
+                             <property name="use_underline">False</property>
+                             <property name="use_markup">False</property>
+                             <property name="justify">GTK_JUSTIFY_LEFT</property>
+                             <property name="wrap">False</property>
+                             <property name="selectable">False</property>
+                             <property name="xalign">0.5</property>
+                             <property name="yalign">0.5</property>
+                             <property name="xpad">0</property>
+                             <property name="ypad">0</property>
+                             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                             <property name="width_chars">-1</property>
+                             <property name="single_line_mode">False</property>
+                             <property name="angle">0</property>
+                           </widget>
+                           <packing>
+                             <property name="type">tab</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkLabel" id="nothing_label">
+                             <property name="visible">True</property>
+                             <property name="label" translatable="yes">Very few (or no) screen savers appear to be available.
+
+This probably means that the &quot;xscreensaver-extras&quot; and
+&quot;xscreensaver-gl-extras&quot; packages are not installed.</property>
+                             <property name="use_underline">False</property>
+                             <property name="use_markup">False</property>
+                             <property name="justify">GTK_JUSTIFY_CENTER</property>
+                             <property name="wrap">False</property>
+                             <property name="selectable">False</property>
+                             <property name="xalign">0.5</property>
+                             <property name="yalign">0.5</property>
+                             <property name="xpad">0</property>
+                             <property name="ypad">0</property>
+                             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                             <property name="width_chars">-1</property>
+                             <property name="single_line_mode">False</property>
+                             <property name="angle">0</property>
+                           </widget>
+                           <packing>
+                             <property name="tab_expand">False</property>
+                             <property name="tab_fill">True</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkLabel" id="nothing_tab">
+                             <property name="visible">True</property>
+                             <property name="label" translatable="yes">nothing</property>
+                             <property name="use_underline">False</property>
+                             <property name="use_markup">False</property>
+                             <property name="justify">GTK_JUSTIFY_LEFT</property>
+                             <property name="wrap">False</property>
+                             <property name="selectable">False</property>
+                             <property name="xalign">0.5</property>
+                             <property name="yalign">0.5</property>
+                             <property name="xpad">0</property>
+                             <property name="ypad">0</property>
+                             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                             <property name="width_chars">-1</property>
+                             <property name="single_line_mode">False</property>
+                             <property name="angle">0</property>
+                           </widget>
+                           <packing>
+                             <property name="type">tab</property>
+                           </packing>
+                         </child>
+                       </widget>
+                     </child>
+
+                     <child>
+                       <widget class="GtkLabel" id="label1">
+                         <property name="visible">True</property>
+                         <property name="label" translatable="yes">Description</property>
+                         <property name="use_underline">False</property>
+                         <property name="use_markup">False</property>
+                         <property name="justify">GTK_JUSTIFY_LEFT</property>
+                         <property name="wrap">False</property>
+                         <property name="selectable">False</property>
+                         <property name="xalign">0.5</property>
+                         <property name="yalign">0.5</property>
+                         <property name="xpad">0</property>
+                         <property name="ypad">0</property>
+                         <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                         <property name="width_chars">-1</property>
+                         <property name="single_line_mode">False</property>
+                         <property name="angle">0</property>
+                         <accessibility>
+                           <atkrelation target="preview_frame" type="label-for"/>
+                         </accessibility>
+                       </widget>
+                       <packing>
+                         <property name="type">label_item</property>
+                       </packing>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="left_attach">1</property>
+                     <property name="right_attach">2</property>
+                     <property name="top_attach">0</property>
+                     <property name="bottom_attach">1</property>
+                     <property name="y_padding">6</property>
+                     <property name="x_options">expand|shrink|fill</property>
+                     <property name="y_options">expand|shrink|fill</property>
+                   </packing>
+                 </child>
+               </widget>
+               <packing>
+                 <property name="tab_expand">False</property>
+                 <property name="tab_fill">True</property>
+               </packing>
+             </child>
+
+             <child>
+               <widget class="GtkLabel" id="demo_tab">
+                 <property name="visible">True</property>
+                 <property name="label" translatable="yes">_Display Modes</property>
+                 <property name="use_underline">True</property>
+                 <property name="use_markup">False</property>
+                 <property name="justify">GTK_JUSTIFY_CENTER</property>
+                 <property name="wrap">False</property>
+                 <property name="selectable">False</property>
+                 <property name="xalign">0.5</property>
+                 <property name="yalign">0.5</property>
+                 <property name="xpad">0</property>
+                 <property name="ypad">0</property>
+                 <property name="mnemonic_widget">notebook</property>
+                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                 <property name="width_chars">-1</property>
+                 <property name="single_line_mode">False</property>
+                 <property name="angle">0</property>
+               </widget>
+               <packing>
+                 <property name="type">tab</property>
+               </packing>
+             </child>
+
+             <child>
+               <widget class="GtkTable" id="options_table">
+                 <property name="visible">True</property>
+                 <property name="n_rows">2</property>
+                 <property name="n_columns">2</property>
+                 <property name="homogeneous">True</property>
+                 <property name="row_spacing">0</property>
+                 <property name="column_spacing">0</property>
+
+                 <child>
+                   <widget class="GtkFrame" id="grab_frame">
+                     <property name="border_width">10</property>
+                     <property name="visible">True</property>
+                     <property name="label_xalign">0</property>
+                     <property name="label_yalign">0.5</property>
+                     <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+                     <accessibility>
+                       <atkrelation target="label2" type="labelled-by"/>
+                     </accessibility>
+
+                     <child>
+                       <widget class="GtkHBox" id="grab_hbox">
+                         <property name="border_width">8</property>
+                         <property name="visible">True</property>
+                         <property name="homogeneous">False</property>
+                         <property name="spacing">8</property>
+
+                         <child>
+                           <widget class="GtkImage" id="image2">
+                             <property name="visible">True</property>
+                             <property name="pixbuf">screensaver-snap.png</property>
+                             <property name="xalign">0</property>
+                             <property name="yalign">0</property>
+                             <property name="xpad">4</property>
+                             <property name="ypad">8</property>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">False</property>
+                             <property name="fill">False</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkVBox" id="grab_vbox">
+                             <property name="visible">True</property>
+                             <property name="homogeneous">False</property>
+                             <property name="spacing">0</property>
+
+                             <child>
+                               <widget class="GtkCheckButton" id="grab_desk_button">
+                                 <property name="visible">True</property>
+                                 <property name="tooltip" translatable="yes">Whether the image-manipulating modes should be allowed to operate on an image of your desktop.</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="label" translatable="yes">Grab Desktop _Images</property>
+                                 <property name="use_underline">True</property>
+                                 <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
+                                 <property name="active">False</property>
+                                 <property name="inconsistent">False</property>
+                                 <property name="draw_indicator">True</property>
+                                 <signal name="toggled" handler="pref_changed_cb"/>
+                               </widget>
+                               <packing>
+                                 <property name="padding">0</property>
+                                 <property name="expand">False</property>
+                                 <property name="fill">False</property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkCheckButton" id="grab_video_button">
+                                 <property name="visible">True</property>
+                                 <property name="tooltip" translatable="yes">Whether the image-manipulating modes should operate on images captured from the system's video input (if there is one.)</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="label" translatable="yes">Grab _Video Frames</property>
+                                 <property name="use_underline">True</property>
+                                 <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
+                                 <property name="active">False</property>
+                                 <property name="inconsistent">False</property>
+                                 <property name="draw_indicator">True</property>
+                                 <signal name="toggled" handler="pref_changed_cb"/>
+                               </widget>
+                               <packing>
+                                 <property name="padding">0</property>
+                                 <property name="expand">False</property>
+                                 <property name="fill">False</property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkCheckButton" id="grab_image_button">
+                                 <property name="visible">True</property>
+                                 <property name="tooltip" translatable="yes">Whether the image-manipulating modes should load image files.</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="label" translatable="yes">Choose _Random Image:</property>
+                                 <property name="use_underline">True</property>
+                                 <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
+                                 <property name="active">False</property>
+                                 <property name="inconsistent">False</property>
+                                 <property name="draw_indicator">True</property>
+                                 <accessibility>
+                                   <atkrelation target="image_text" type="controller-for"/>
+                                   <atkrelation target="image_browse_button" type="controller-for"/>
+                                 </accessibility>
+                                 <signal name="toggled" handler="pref_changed_cb"/>
+                               </widget>
+                               <packing>
+                                 <property name="padding">0</property>
+                                 <property name="expand">False</property>
+                                 <property name="fill">False</property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkHBox" id="image_hbox">
+                                 <property name="visible">True</property>
+                                 <property name="homogeneous">False</property>
+                                 <property name="spacing">0</property>
+
+                                 <child>
+                                   <widget class="GtkLabel" id="grab_dummy">
+                                     <property name="visible">True</property>
+                                     <property name="label" translatable="yes"></property>
+                                     <property name="use_underline">False</property>
+                                     <property name="use_markup">False</property>
+                                     <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                     <property name="wrap">False</property>
+                                     <property name="selectable">False</property>
+                                     <property name="xalign">0.5</property>
+                                     <property name="yalign">0.5</property>
+                                     <property name="xpad">8</property>
+                                     <property name="ypad">0</property>
+                                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                     <property name="width_chars">-1</property>
+                                     <property name="single_line_mode">False</property>
+                                     <property name="angle">0</property>
+                                   </widget>
+                                   <packing>
+                                     <property name="padding">0</property>
+                                     <property name="expand">False</property>
+                                     <property name="fill">False</property>
+                                   </packing>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkEntry" id="image_text">
+                                     <property name="visible">True</property>
+                                     <property name="tooltip" translatable="yes">The local directory, RSS feed or Atom feed from which images will be randomly chosen.</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="editable">True</property>
+                                     <property name="visibility">True</property>
+                                     <property name="max_length">0</property>
+                                     <property name="text" translatable="yes"></property>
+                                     <property name="has_frame">True</property>
+                                     <property name="invisible_char">*</property>
+                                     <property name="activates_default">False</property>
+                                     <accessibility>
+                                       <atkrelation target="grab_image_button" type="labelled-by"/>
+                                       <atkrelation target="grab_image_button" type="controlled-by"/>
+                                     </accessibility>
+                                     <signal name="activate" handler="pref_changed_cb"/>
+                                     <signal name="focus_out_event" handler="pref_changed_event_cb"/>
+                                   </widget>
+                                   <packing>
+                                     <property name="padding">2</property>
+                                     <property name="expand">True</property>
+                                     <property name="fill">True</property>
+                                   </packing>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkButton" id="image_browse_button">
+                                     <property name="visible">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="label" translatable="yes">_Browse</property>
+                                     <property name="use_underline">True</property>
+                                     <property name="relief">GTK_RELIEF_NORMAL</property>
+                                     <property name="focus_on_click">True</property>
+                                     <signal name="clicked" handler="browse_image_dir_cb"/>
+                                   </widget>
+                                   <packing>
+                                     <property name="padding">0</property>
+                                     <property name="expand">False</property>
+                                     <property name="fill">False</property>
+                                   </packing>
+                                 </child>
+                               </widget>
+                               <packing>
+                                 <property name="padding">0</property>
+                                 <property name="expand">False</property>
+                                 <property name="fill">False</property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkLabel" id="label8">
+                                 <property name="visible">True</property>
+                                 <property name="label" translatable="yes">Local directory, or RSS feed URL.</property>
+                                 <property name="use_underline">False</property>
+                                 <property name="use_markup">False</property>
+                                 <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                 <property name="wrap">False</property>
+                                 <property name="selectable">False</property>
+                                 <property name="xalign">0</property>
+                                 <property name="yalign">0.5</property>
+                                 <property name="xpad">20</property>
+                                 <property name="ypad">0</property>
+                                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                 <property name="width_chars">-1</property>
+                                 <property name="single_line_mode">False</property>
+                                 <property name="angle">0</property>
+                               </widget>
+                               <packing>
+                                 <property name="padding">0</property>
+                                 <property name="expand">False</property>
+                                 <property name="fill">False</property>
+                               </packing>
+                             </child>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">True</property>
+                             <property name="fill">True</property>
+                           </packing>
+                         </child>
+                       </widget>
+                     </child>
+
+                     <child>
+                       <widget class="GtkLabel" id="label2">
+                         <property name="visible">True</property>
+                         <property name="label" translatable="yes">Image Manipulation</property>
+                         <property name="use_underline">False</property>
+                         <property name="use_markup">False</property>
+                         <property name="justify">GTK_JUSTIFY_LEFT</property>
+                         <property name="wrap">False</property>
+                         <property name="selectable">False</property>
+                         <property name="xalign">0.5</property>
+                         <property name="yalign">0.5</property>
+                         <property name="xpad">0</property>
+                         <property name="ypad">0</property>
+                         <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                         <property name="width_chars">-1</property>
+                         <property name="single_line_mode">False</property>
+                         <property name="angle">0</property>
+                         <accessibility>
+                           <atkrelation target="grab_frame" type="label-for"/>
+                         </accessibility>
+                       </widget>
+                       <packing>
+                         <property name="type">label_item</property>
+                       </packing>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="left_attach">0</property>
+                     <property name="right_attach">1</property>
+                     <property name="top_attach">0</property>
+                     <property name="bottom_attach">1</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkFrame" id="diag_frame">
+                     <property name="border_width">10</property>
+                     <property name="visible">True</property>
+                     <property name="label_xalign">0</property>
+                     <property name="label_yalign">0.5</property>
+                     <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+                     <accessibility>
+                       <atkrelation target="label3" type="labelled-by"/>
+                     </accessibility>
+
+                     <child>
+                       <widget class="GtkHBox" id="diag_hbox">
+                         <property name="border_width">8</property>
+                         <property name="visible">True</property>
+                         <property name="homogeneous">False</property>
+                         <property name="spacing">8</property>
+
+                         <child>
+                           <widget class="GtkImage" id="diag_logo">
+                             <property name="visible">True</property>
+                             <property name="pixbuf">screensaver-diagnostic.png</property>
+                             <property name="xalign">0.5</property>
+                             <property name="yalign">0</property>
+                             <property name="xpad">0</property>
+                             <property name="ypad">0</property>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">False</property>
+                             <property name="fill">False</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkTable" id="text_table">
+                             <property name="visible">True</property>
+                             <property name="n_rows">5</property>
+                             <property name="n_columns">3</property>
+                             <property name="homogeneous">False</property>
+                             <property name="row_spacing">2</property>
+                             <property name="column_spacing">2</property>
+
+                             <child>
+                               <widget class="GtkRadioButton" id="text_radio">
+                                 <property name="visible">True</property>
+                                 <property name="tooltip" translatable="yes">Text-displaying modes will display the text typed here.</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="label" translatable="yes">_Text</property>
+                                 <property name="use_underline">True</property>
+                                 <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
+                                 <property name="active">False</property>
+                                 <property name="inconsistent">False</property>
+                                 <property name="draw_indicator">True</property>
+                                 <accessibility>
+                                   <atkrelation target="text_entry" type="controller-for"/>
+                                   <atkrelation target="text_entry" type="label-for"/>
+                                 </accessibility>
+                                 <signal name="toggled" handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:31:44 GMT"/>
+                               </widget>
+                               <packing>
+                                 <property name="left_attach">0</property>
+                                 <property name="right_attach">1</property>
+                                 <property name="top_attach">1</property>
+                                 <property name="bottom_attach">2</property>
+                                 <property name="x_options">fill</property>
+                                 <property name="y_options"></property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkRadioButton" id="text_file_radio">
+                                 <property name="visible">True</property>
+                                 <property name="tooltip" translatable="yes">Text-displaying modes will display the contents of this file.</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="label" translatable="yes">Text _file</property>
+                                 <property name="use_underline">True</property>
+                                 <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
+                                 <property name="active">False</property>
+                                 <property name="inconsistent">False</property>
+                                 <property name="draw_indicator">True</property>
+                                 <property name="group">text_radio</property>
+                                 <accessibility>
+                                   <atkrelation target="text_file_entry" type="label-for"/>
+                                   <atkrelation target="text_file_entry" type="controller-for"/>
+                                 </accessibility>
+                                 <signal name="toggled" handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:31:55 GMT"/>
+                               </widget>
+                               <packing>
+                                 <property name="left_attach">0</property>
+                                 <property name="right_attach">1</property>
+                                 <property name="top_attach">2</property>
+                                 <property name="bottom_attach">3</property>
+                                 <property name="x_options">fill</property>
+                                 <property name="y_options"></property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkRadioButton" id="text_program_radio">
+                                 <property name="visible">True</property>
+                                 <property name="tooltip" translatable="yes">Text-displaying modes will display the output of this program.</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="label" translatable="yes">_Program</property>
+                                 <property name="use_underline">True</property>
+                                 <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
+                                 <property name="active">False</property>
+                                 <property name="inconsistent">False</property>
+                                 <property name="draw_indicator">True</property>
+                                 <property name="group">text_radio</property>
+                                 <accessibility>
+                                   <atkrelation target="text_program_entry" type="label-for"/>
+                                   <atkrelation target="text_program_entry" type="controller-for"/>
+                                   <atkrelation target="text_program_browse" type="controller-for"/>
+                                 </accessibility>
+                                 <signal name="toggled" handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:32:07 GMT"/>
+                               </widget>
+                               <packing>
+                                 <property name="left_attach">0</property>
+                                 <property name="right_attach">1</property>
+                                 <property name="top_attach">3</property>
+                                 <property name="bottom_attach">4</property>
+                                 <property name="x_options">fill</property>
+                                 <property name="y_options"></property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkRadioButton" id="text_url_radio">
+                                 <property name="visible">True</property>
+                                 <property name="tooltip" translatable="yes">Text-displaying modes will display the contents of this URL (HTML or RSS).</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="label" translatable="yes">_URL</property>
+                                 <property name="use_underline">True</property>
+                                 <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
+                                 <property name="active">False</property>
+                                 <property name="inconsistent">False</property>
+                                 <property name="draw_indicator">True</property>
+                                 <property name="group">text_radio</property>
+                                 <accessibility>
+                                   <atkrelation target="text_url_entry" type="label-for"/>
+                                   <atkrelation target="text_url_entry" type="controller-for"/>
+                                 </accessibility>
+                                 <signal name="toggled" handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:32:17 GMT"/>
+                               </widget>
+                               <packing>
+                                 <property name="left_attach">0</property>
+                                 <property name="right_attach">1</property>
+                                 <property name="top_attach">4</property>
+                                 <property name="bottom_attach">5</property>
+                                 <property name="x_options">fill</property>
+                                 <property name="y_options"></property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkRadioButton" id="text_host_radio">
+                                 <property name="visible">True</property>
+                                 <property name="tooltip" translatable="yes">Text-displaying modes will display the local host name, date, and time.</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="label" translatable="yes">_Host Name and Time</property>
+                                 <property name="use_underline">True</property>
+                                 <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
+                                 <property name="active">True</property>
+                                 <property name="inconsistent">False</property>
+                                 <property name="draw_indicator">True</property>
+                                 <property name="group">text_radio</property>
+                                 <signal name="toggled" handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:31:32 GMT"/>
+                               </widget>
+                               <packing>
+                                 <property name="left_attach">0</property>
+                                 <property name="right_attach">3</property>
+                                 <property name="top_attach">0</property>
+                                 <property name="bottom_attach">1</property>
+                                 <property name="x_options">fill</property>
+                                 <property name="y_options"></property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkEntry" id="text_url_entry">
+                                 <property name="visible">True</property>
+                                 <property name="tooltip" translatable="yes">Text-displaying modes will display the contents of this URL (HTML or RSS).</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="editable">True</property>
+                                 <property name="visibility">True</property>
+                                 <property name="max_length">0</property>
+                                 <property name="text" translatable="yes"></property>
+                                 <property name="has_frame">True</property>
+                                 <property name="invisible_char">*</property>
+                                 <property name="activates_default">False</property>
+                                 <accessibility>
+                                   <atkrelation target="text_url_radio" type="controlled-by"/>
+                                 </accessibility>
+                                 <signal name="activate" handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:33:10 GMT"/>
+                                 <signal name="focus_out_event" handler="pref_changed_event_cb" last_modification_time="Sun, 20 Mar 2005 21:34:26 GMT"/>
+                               </widget>
+                               <packing>
+                                 <property name="left_attach">1</property>
+                                 <property name="right_attach">3</property>
+                                 <property name="top_attach">4</property>
+                                 <property name="bottom_attach">5</property>
+                                 <property name="y_options"></property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkButton" id="text_file_browse">
+                                 <property name="visible">True</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="label" translatable="yes">_Browse</property>
+                                 <property name="use_underline">True</property>
+                                 <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
+                                 <accessibility>
+                                   <atkrelation target="text_file_radio" type="controlled-by"/>
+                                 </accessibility>
+                                 <signal name="clicked" handler="browse_text_file_cb" last_modification_time="Sun, 20 Mar 2005 01:24:38 GMT"/>
+                               </widget>
+                               <packing>
+                                 <property name="left_attach">2</property>
+                                 <property name="right_attach">3</property>
+                                 <property name="top_attach">2</property>
+                                 <property name="bottom_attach">3</property>
+                                 <property name="x_options">fill</property>
+                                 <property name="y_options"></property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkEntry" id="text_entry">
+                                 <property name="visible">True</property>
+                                 <property name="tooltip" translatable="yes">Text-displaying modes will display the text typed here.</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="editable">True</property>
+                                 <property name="visibility">True</property>
+                                 <property name="max_length">0</property>
+                                 <property name="text" translatable="yes"></property>
+                                 <property name="has_frame">True</property>
+                                 <property name="invisible_char">*</property>
+                                 <property name="activates_default">False</property>
+                                 <accessibility>
+                                   <atkrelation target="text_program_radio" type="labelled-by"/>
+                                   <atkrelation target="text_program_radio" type="controlled-by"/>
+                                 </accessibility>
+                                 <signal name="activate" handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:32:42 GMT"/>
+                                 <signal name="focus_out_event" handler="pref_changed_event_cb" last_modification_time="Sun, 20 Mar 2005 21:33:43 GMT"/>
+                               </widget>
+                               <packing>
+                                 <property name="left_attach">1</property>
+                                 <property name="right_attach">3</property>
+                                 <property name="top_attach">1</property>
+                                 <property name="bottom_attach">2</property>
+                                 <property name="y_options"></property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkEntry" id="text_program_entry">
+                                 <property name="visible">True</property>
+                                 <property name="tooltip" translatable="yes">Text-displaying modes will display the output of this program.</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="editable">True</property>
+                                 <property name="visibility">True</property>
+                                 <property name="max_length">0</property>
+                                 <property name="text" translatable="yes"></property>
+                                 <property name="has_frame">True</property>
+                                 <property name="invisible_char">*</property>
+                                 <property name="activates_default">False</property>
+                                 <accessibility>
+                                   <atkrelation target="text_program_radio" type="labelled-by"/>
+                                   <atkrelation target="text_program_radio" type="controlled-by"/>
+                                 </accessibility>
+                                 <signal name="activate" handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:33:02 GMT"/>
+                                 <signal name="focus_out_event" handler="pref_changed_event_cb" last_modification_time="Sun, 20 Mar 2005 21:34:15 GMT"/>
+                               </widget>
+                               <packing>
+                                 <property name="left_attach">1</property>
+                                 <property name="right_attach">2</property>
+                                 <property name="top_attach">3</property>
+                                 <property name="bottom_attach">4</property>
+                                 <property name="y_options"></property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkButton" id="text_program_browse">
+                                 <property name="visible">True</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="label" translatable="yes">_Browse</property>
+                                 <property name="use_underline">True</property>
+                                 <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
+                                 <accessibility>
+                                   <atkrelation target="text_program_radio" type="controller-for"/>
+                                 </accessibility>
+                                 <signal name="clicked" handler="browse_text_program_cb" last_modification_time="Sun, 20 Mar 2005 01:24:51 GMT"/>
+                               </widget>
+                               <packing>
+                                 <property name="left_attach">2</property>
+                                 <property name="right_attach">3</property>
+                                 <property name="top_attach">3</property>
+                                 <property name="bottom_attach">4</property>
+                                 <property name="x_options">fill</property>
+                                 <property name="y_options"></property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkEntry" id="text_file_entry">
+                                 <property name="visible">True</property>
+                                 <property name="tooltip" translatable="yes">Text-displaying modes will display the contents of this file.</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="editable">True</property>
+                                 <property name="visibility">True</property>
+                                 <property name="max_length">0</property>
+                                 <property name="text" translatable="yes"></property>
+                                 <property name="has_frame">True</property>
+                                 <property name="invisible_char">*</property>
+                                 <property name="activates_default">False</property>
+                                 <accessibility>
+                                   <atkrelation target="text_file_radio" type="labelled-by"/>
+                                   <atkrelation target="text_file_radio" type="controlled-by"/>
+                                 </accessibility>
+                                 <signal name="activate" handler="pref_changed_cb" last_modification_time="Sun, 20 Mar 2005 21:32:53 GMT"/>
+                                 <signal name="focus_out_event" handler="pref_changed_event_cb" last_modification_time="Sun, 20 Mar 2005 21:33:55 GMT"/>
+                               </widget>
+                               <packing>
+                                 <property name="left_attach">1</property>
+                                 <property name="right_attach">2</property>
+                                 <property name="top_attach">2</property>
+                                 <property name="bottom_attach">3</property>
+                                 <property name="y_options"></property>
+                               </packing>
+                             </child>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">True</property>
+                             <property name="fill">True</property>
+                           </packing>
+                         </child>
+                       </widget>
+                     </child>
+
+                     <child>
+                       <widget class="GtkLabel" id="label3">
+                         <property name="visible">True</property>
+                         <property name="label" translatable="yes">Text Manipulation</property>
+                         <property name="use_underline">False</property>
+                         <property name="use_markup">False</property>
+                         <property name="justify">GTK_JUSTIFY_LEFT</property>
+                         <property name="wrap">False</property>
+                         <property name="selectable">False</property>
+                         <property name="xalign">0.5</property>
+                         <property name="yalign">0.5</property>
+                         <property name="xpad">0</property>
+                         <property name="ypad">0</property>
+                         <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                         <property name="width_chars">-1</property>
+                         <property name="single_line_mode">False</property>
+                         <property name="angle">0</property>
+                         <accessibility>
+                           <atkrelation target="diag_frame" type="label-for"/>
+                         </accessibility>
+                       </widget>
+                       <packing>
+                         <property name="type">label_item</property>
+                       </packing>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="left_attach">0</property>
+                     <property name="right_attach">1</property>
+                     <property name="top_attach">1</property>
+                     <property name="bottom_attach">2</property>
+                     <property name="x_options">fill</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkFrame" id="dpms_frame">
+                     <property name="border_width">10</property>
+                     <property name="visible">True</property>
+                     <property name="label_xalign">0</property>
+                     <property name="label_yalign">0.5</property>
+                     <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+
+                     <child>
+                       <widget class="GtkHBox" id="dpms_hbox">
+                         <property name="border_width">8</property>
+                         <property name="visible">True</property>
+                         <property name="homogeneous">False</property>
+                         <property name="spacing">8</property>
+
+                         <child>
+                           <widget class="GtkImage" id="dpms_logo">
+                             <property name="visible">True</property>
+                             <property name="pixbuf">screensaver-power.png</property>
+                             <property name="xalign">0.5</property>
+                             <property name="yalign">0</property>
+                             <property name="xpad">0</property>
+                             <property name="ypad">0</property>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">False</property>
+                             <property name="fill">False</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkVBox" id="vbox6">
+                             <property name="visible">True</property>
+                             <property name="homogeneous">False</property>
+                             <property name="spacing">0</property>
+
+                             <child>
+                               <widget class="GtkCheckButton" id="dpms_button">
+                                 <property name="visible">True</property>
+                                 <property name="tooltip" translatable="yes">Whether the monitor should be powered down after a while.</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="label" translatable="yes">_Power Management Enabled</property>
+                                 <property name="use_underline">True</property>
+                                 <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
+                                 <property name="active">True</property>
+                                 <property name="inconsistent">False</property>
+                                 <property name="draw_indicator">True</property>
+                                 <accessibility>
+                                   <atkrelation target="dpms_suspend_spinbutton" type="controller-for"/>
+                                   <atkrelation target="dpms_standby_spinbutton" type="controller-for"/>
+                                   <atkrelation target="dpms_off_spinbutton" type="controller-for"/>
+                                 </accessibility>
+                                 <signal name="toggled" handler="pref_changed_cb"/>
+                               </widget>
+                               <packing>
+                                 <property name="padding">0</property>
+                                 <property name="expand">False</property>
+                                 <property name="fill">False</property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkTable" id="dpms_table">
+                                 <property name="visible">True</property>
+                                 <property name="n_rows">3</property>
+                                 <property name="n_columns">3</property>
+                                 <property name="homogeneous">False</property>
+                                 <property name="row_spacing">2</property>
+                                 <property name="column_spacing">4</property>
+
+                                 <child>
+                                   <widget class="GtkLabel" id="dpms_standby_label">
+                                     <property name="visible">True</property>
+                                     <property name="label" translatable="yes">Stand_by After</property>
+                                     <property name="use_underline">True</property>
+                                     <property name="use_markup">False</property>
+                                     <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                     <property name="wrap">False</property>
+                                     <property name="selectable">False</property>
+                                     <property name="xalign">1</property>
+                                     <property name="yalign">0.5</property>
+                                     <property name="xpad">10</property>
+                                     <property name="ypad">0</property>
+                                     <property name="mnemonic_widget">dpms_standby_spinbutton</property>
+                                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                     <property name="width_chars">-1</property>
+                                     <property name="single_line_mode">False</property>
+                                     <property name="angle">0</property>
+                                     <accessibility>
+                                       <atkrelation target="dpms_standby_spinbutton" type="label-for"/>
+                                       <atkrelation target="dpms_standby_spinbutton" type="flows-to"/>
+                                     </accessibility>
+                                   </widget>
+                                   <packing>
+                                     <property name="left_attach">0</property>
+                                     <property name="right_attach">1</property>
+                                     <property name="top_attach">0</property>
+                                     <property name="bottom_attach">1</property>
+                                     <property name="x_options">fill</property>
+                                     <property name="y_options"></property>
+                                   </packing>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkLabel" id="dpms_suspend_label">
+                                     <property name="visible">True</property>
+                                     <property name="label" translatable="yes">Sus_pend After</property>
+                                     <property name="use_underline">True</property>
+                                     <property name="use_markup">False</property>
+                                     <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                     <property name="wrap">False</property>
+                                     <property name="selectable">False</property>
+                                     <property name="xalign">1</property>
+                                     <property name="yalign">0.5</property>
+                                     <property name="xpad">10</property>
+                                     <property name="ypad">0</property>
+                                     <property name="mnemonic_widget">dpms_suspend_spinbutton</property>
+                                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                     <property name="width_chars">-1</property>
+                                     <property name="single_line_mode">False</property>
+                                     <property name="angle">0</property>
+                                     <accessibility>
+                                       <atkrelation target="dpms_suspend_spinbutton" type="label-for"/>
+                                       <atkrelation target="dpms_suspend_spinbutton" type="flows-to"/>
+                                     </accessibility>
+                                   </widget>
+                                   <packing>
+                                     <property name="left_attach">0</property>
+                                     <property name="right_attach">1</property>
+                                     <property name="top_attach">1</property>
+                                     <property name="bottom_attach">2</property>
+                                     <property name="x_options">fill</property>
+                                     <property name="y_options"></property>
+                                   </packing>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkLabel" id="dpms_off_label">
+                                     <property name="visible">True</property>
+                                     <property name="label" translatable="yes">_Off After</property>
+                                     <property name="use_underline">True</property>
+                                     <property name="use_markup">False</property>
+                                     <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                     <property name="wrap">False</property>
+                                     <property name="selectable">False</property>
+                                     <property name="xalign">1</property>
+                                     <property name="yalign">0.5</property>
+                                     <property name="xpad">10</property>
+                                     <property name="ypad">0</property>
+                                     <property name="mnemonic_widget">dpms_off_spinbutton</property>
+                                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                     <property name="width_chars">-1</property>
+                                     <property name="single_line_mode">False</property>
+                                     <property name="angle">0</property>
+                                     <accessibility>
+                                       <atkrelation target="dpms_off_spinbutton" type="label-for"/>
+                                       <atkrelation target="dpms_off_spinbutton" type="flows-to"/>
+                                     </accessibility>
+                                   </widget>
+                                   <packing>
+                                     <property name="left_attach">0</property>
+                                     <property name="right_attach">1</property>
+                                     <property name="top_attach">2</property>
+                                     <property name="bottom_attach">3</property>
+                                     <property name="x_options">fill</property>
+                                     <property name="y_options"></property>
+                                   </packing>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkLabel" id="dpms_standby_mlabel">
+                                     <property name="visible">True</property>
+                                     <property name="label" translatable="yes">minutes</property>
+                                     <property name="use_underline">False</property>
+                                     <property name="use_markup">False</property>
+                                     <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                     <property name="wrap">False</property>
+                                     <property name="selectable">False</property>
+                                     <property name="xalign">0</property>
+                                     <property name="yalign">0.5</property>
+                                     <property name="xpad">0</property>
+                                     <property name="ypad">0</property>
+                                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                     <property name="width_chars">-1</property>
+                                     <property name="single_line_mode">False</property>
+                                     <property name="angle">0</property>
+                                     <accessibility>
+                                       <atkrelation target="dpms_standby_spinbutton" type="label-for"/>
+                                       <atkrelation target="dpms_standby_spinbutton" type="flows-from"/>
+                                     </accessibility>
+                                   </widget>
+                                   <packing>
+                                     <property name="left_attach">2</property>
+                                     <property name="right_attach">3</property>
+                                     <property name="top_attach">0</property>
+                                     <property name="bottom_attach">1</property>
+                                     <property name="x_options">fill</property>
+                                     <property name="y_options"></property>
+                                   </packing>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkLabel" id="dpms_suspend_mlabel">
+                                     <property name="visible">True</property>
+                                     <property name="label" translatable="yes">minutes</property>
+                                     <property name="use_underline">False</property>
+                                     <property name="use_markup">False</property>
+                                     <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                     <property name="wrap">False</property>
+                                     <property name="selectable">False</property>
+                                     <property name="xalign">0</property>
+                                     <property name="yalign">0.5</property>
+                                     <property name="xpad">0</property>
+                                     <property name="ypad">0</property>
+                                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                     <property name="width_chars">-1</property>
+                                     <property name="single_line_mode">False</property>
+                                     <property name="angle">0</property>
+                                     <accessibility>
+                                       <atkrelation target="dpms_suspend_spinbutton" type="label-for"/>
+                                       <atkrelation target="dpms_suspend_spinbutton" type="flows-from"/>
+                                     </accessibility>
+                                   </widget>
+                                   <packing>
+                                     <property name="left_attach">2</property>
+                                     <property name="right_attach">3</property>
+                                     <property name="top_attach">1</property>
+                                     <property name="bottom_attach">2</property>
+                                     <property name="x_options">fill</property>
+                                     <property name="y_options"></property>
+                                   </packing>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkLabel" id="dpms_off_mlabel">
+                                     <property name="visible">True</property>
+                                     <property name="label" translatable="yes">minutes</property>
+                                     <property name="use_underline">False</property>
+                                     <property name="use_markup">False</property>
+                                     <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                     <property name="wrap">False</property>
+                                     <property name="selectable">False</property>
+                                     <property name="xalign">0</property>
+                                     <property name="yalign">0.5</property>
+                                     <property name="xpad">0</property>
+                                     <property name="ypad">0</property>
+                                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                     <property name="width_chars">-1</property>
+                                     <property name="single_line_mode">False</property>
+                                     <property name="angle">0</property>
+                                     <accessibility>
+                                       <atkrelation target="dpms_off_spinbutton" type="label-for"/>
+                                       <atkrelation target="dpms_off_spinbutton" type="flows-from"/>
+                                     </accessibility>
+                                   </widget>
+                                   <packing>
+                                     <property name="left_attach">2</property>
+                                     <property name="right_attach">3</property>
+                                     <property name="top_attach">2</property>
+                                     <property name="bottom_attach">3</property>
+                                     <property name="x_options">fill</property>
+                                     <property name="y_options"></property>
+                                   </packing>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkSpinButton" id="dpms_off_spinbutton">
+                                     <property name="visible">True</property>
+                                     <property name="tooltip" translatable="yes">How long until the monitor powers down.</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="climb_rate">15</property>
+                                     <property name="digits">0</property>
+                                     <property name="numeric">True</property>
+                                     <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+                                     <property name="snap_to_ticks">True</property>
+                                     <property name="wrap">False</property>
+                                     <property name="adjustment">0 0 1440 1 15 0</property>
+                                     <accessibility>
+                                       <atkrelation target="dpms_button" type="controlled-by"/>
+                                       <atkrelation target="dpms_off_label" type="labelled-by"/>
+                                       <atkrelation target="dpms_off_mlabel" type="labelled-by"/>
+                                       <atkrelation target="dpms_off_label" type="flows-from"/>
+                                       <atkrelation target="dpms_off_mlabel" type="flows-to"/>
+                                     </accessibility>
+                                     <signal name="activate" handler="pref_changed_cb"/>
+                                     <signal name="focus_out_event" handler="pref_changed_event_cb"/>
+                                     <signal name="value_changed" handler="pref_changed_cb"/>
+                                   </widget>
+                                   <packing>
+                                     <property name="left_attach">1</property>
+                                     <property name="right_attach">2</property>
+                                     <property name="top_attach">2</property>
+                                     <property name="bottom_attach">3</property>
+                                     <property name="x_options"></property>
+                                     <property name="y_options"></property>
+                                   </packing>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkSpinButton" id="dpms_suspend_spinbutton">
+                                     <property name="visible">True</property>
+                                     <property name="tooltip" translatable="yes">How long until the monitor goes into power-saving mode.</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="climb_rate">15</property>
+                                     <property name="digits">0</property>
+                                     <property name="numeric">True</property>
+                                     <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+                                     <property name="snap_to_ticks">True</property>
+                                     <property name="wrap">False</property>
+                                     <property name="adjustment">0 0 1440 1 15 0</property>
+                                     <accessibility>
+                                       <atkrelation target="dpms_button" type="controlled-by"/>
+                                       <atkrelation target="dpms_suspend_label" type="labelled-by"/>
+                                       <atkrelation target="dpms_suspend_mlabel" type="labelled-by"/>
+                                       <atkrelation target="dpms_suspend_label" type="flows-from"/>
+                                       <atkrelation target="dpms_suspend_mlabel" type="flows-to"/>
+                                     </accessibility>
+                                     <signal name="activate" handler="pref_changed_cb"/>
+                                     <signal name="focus_out_event" handler="pref_changed_event_cb"/>
+                                     <signal name="value_changed" handler="pref_changed_cb"/>
+                                   </widget>
+                                   <packing>
+                                     <property name="left_attach">1</property>
+                                     <property name="right_attach">2</property>
+                                     <property name="top_attach">1</property>
+                                     <property name="bottom_attach">2</property>
+                                     <property name="x_options"></property>
+                                     <property name="y_options"></property>
+                                   </packing>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkSpinButton" id="dpms_standby_spinbutton">
+                                     <property name="visible">True</property>
+                                     <property name="tooltip" translatable="yes">How long until the monitor goes completely black.</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="climb_rate">15</property>
+                                     <property name="digits">0</property>
+                                     <property name="numeric">True</property>
+                                     <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+                                     <property name="snap_to_ticks">True</property>
+                                     <property name="wrap">False</property>
+                                     <property name="adjustment">0 0 1440 1 15 0</property>
+                                     <accessibility>
+                                       <atkrelation target="dpms_button" type="controlled-by"/>
+                                       <atkrelation target="dpms_standby_label" type="labelled-by"/>
+                                       <atkrelation target="dpms_standby_mlabel" type="labelled-by"/>
+                                       <atkrelation target="dpms_standby_label" type="flows-from"/>
+                                       <atkrelation target="dpms_standby_mlabel" type="flows-to"/>
+                                     </accessibility>
+                                     <signal name="activate" handler="pref_changed_cb"/>
+                                     <signal name="focus_out_event" handler="pref_changed_event_cb"/>
+                                     <signal name="value_changed" handler="pref_changed_cb"/>
+                                   </widget>
+                                   <packing>
+                                     <property name="left_attach">1</property>
+                                     <property name="right_attach">2</property>
+                                     <property name="top_attach">0</property>
+                                     <property name="bottom_attach">1</property>
+                                     <property name="x_options"></property>
+                                     <property name="y_options"></property>
+                                   </packing>
+                                 </child>
+                               </widget>
+                               <packing>
+                                 <property name="padding">0</property>
+                                 <property name="expand">False</property>
+                                 <property name="fill">True</property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkCheckButton" id="dpms_quickoff_button">
+                                 <property name="visible">True</property>
+                                 <property name="tooltip" translatable="yes">Whether the monitor should be powered off immediately in "Blank Screen Only" mode, regardless of the above power-management timeouts.</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="label" translatable="yes">_Quick Power-off in Blank Only Mode</property>
+                                 <property name="use_underline">True</property>
+                                 <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
+                                 <property name="active">False</property>
+                                 <property name="inconsistent">False</property>
+                                 <property name="draw_indicator">True</property>
+                                 <signal name="toggled" handler="pref_changed_cb"/>
+                               </widget>
+                               <packing>
+                                 <property name="padding">0</property>
+                                 <property name="expand">False</property>
+                                 <property name="fill">False</property>
+                               </packing>
+                             </child>
+
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">True</property>
+                             <property name="fill">True</property>
+                           </packing>
+                         </child>
+                       </widget>
+                     </child>
+
+                     <child>
+                       <widget class="GtkLabel" id="label4">
+                         <property name="visible">True</property>
+                         <property name="label" translatable="yes">Display Power Management</property>
+                         <property name="use_underline">False</property>
+                         <property name="use_markup">False</property>
+                         <property name="justify">GTK_JUSTIFY_LEFT</property>
+                         <property name="wrap">False</property>
+                         <property name="selectable">False</property>
+                         <property name="xalign">0.5</property>
+                         <property name="yalign">0.5</property>
+                         <property name="xpad">0</property>
+                         <property name="ypad">0</property>
+                         <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                         <property name="width_chars">-1</property>
+                         <property name="single_line_mode">False</property>
+                         <property name="angle">0</property>
+                         <accessibility>
+                           <atkrelation target="dpms_frame" type="label-for"/>
+                         </accessibility>
+                       </widget>
+                       <packing>
+                         <property name="type">label_item</property>
+                       </packing>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="left_attach">1</property>
+                     <property name="right_attach">2</property>
+                     <property name="top_attach">0</property>
+                     <property name="bottom_attach">1</property>
+                     <property name="y_options">fill</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkFrame" id="cmap_frame">
+                     <property name="border_width">10</property>
+                     <property name="visible">True</property>
+                     <property name="label_xalign">0</property>
+                     <property name="label_yalign">0.5</property>
+                     <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+                     <accessibility>
+                       <atkrelation target="label5" type="labelled-by"/>
+                     </accessibility>
+
+                     <child>
+                       <widget class="GtkHBox" id="cmap_hbox">
+                         <property name="border_width">8</property>
+                         <property name="visible">True</property>
+                         <property name="homogeneous">False</property>
+                         <property name="spacing">8</property>
+
+                         <child>
+                           <widget class="GtkImage" id="image5">
+                             <property name="visible">True</property>
+                             <property name="pixbuf">screensaver-colorselector.png</property>
+                             <property name="xalign">0.5</property>
+                             <property name="yalign">0</property>
+                             <property name="xpad">0</property>
+                             <property name="ypad">0</property>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">False</property>
+                             <property name="fill">False</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkVBox" id="vbox7">
+                             <property name="visible">True</property>
+                             <property name="homogeneous">False</property>
+                             <property name="spacing">0</property>
+
+                             <child>
+                               <widget class="GtkCheckButton" id="fade_button">
+                                 <property name="visible">True</property>
+                                 <property name="tooltip" translatable="yes">Whether the screen should slowly fade to black when the screen saver activates.</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="label" translatable="yes">Fade to Black when _Blanking</property>
+                                 <property name="use_underline">True</property>
+                                 <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
+                                 <property name="active">False</property>
+                                 <property name="inconsistent">False</property>
+                                 <property name="draw_indicator">True</property>
+                                 <accessibility>
+                                   <atkrelation target="fade_spinbutton" type="controller-for"/>
+                                 </accessibility>
+                                 <signal name="toggled" handler="pref_changed_cb"/>
+                               </widget>
+                               <packing>
+                                 <property name="padding">0</property>
+                                 <property name="expand">False</property>
+                                 <property name="fill">False</property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkCheckButton" id="unfade_button">
+                                 <property name="visible">True</property>
+                                 <property name="tooltip" translatable="yes">Whether the screen should slowly fade in from black when the screen saver deactivates.</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="label" translatable="yes">Fade from Black When _Unblanking</property>
+                                 <property name="use_underline">True</property>
+                                 <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
+                                 <property name="active">False</property>
+                                 <property name="inconsistent">False</property>
+                                 <property name="draw_indicator">True</property>
+                                 <accessibility>
+                                   <atkrelation target="fade_spinbutton" type="controller-for"/>
+                                 </accessibility>
+                                 <signal name="toggled" handler="pref_changed_cb"/>
+                               </widget>
+                               <packing>
+                                 <property name="padding">0</property>
+                                 <property name="expand">False</property>
+                                 <property name="fill">False</property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkHBox" id="fade_hbox">
+                                 <property name="visible">True</property>
+                                 <property name="homogeneous">False</property>
+                                 <property name="spacing">0</property>
+
+                                 <child>
+                                   <widget class="GtkLabel" id="fade_dummy">
+                                     <property name="visible">True</property>
+                                     <property name="label" translatable="yes"></property>
+                                     <property name="use_underline">False</property>
+                                     <property name="use_markup">False</property>
+                                     <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                     <property name="wrap">False</property>
+                                     <property name="selectable">False</property>
+                                     <property name="xalign">0.5</property>
+                                     <property name="yalign">0.5</property>
+                                     <property name="xpad">3</property>
+                                     <property name="ypad">0</property>
+                                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                     <property name="width_chars">-1</property>
+                                     <property name="single_line_mode">False</property>
+                                     <property name="angle">0</property>
+                                   </widget>
+                                   <packing>
+                                     <property name="padding">0</property>
+                                     <property name="expand">False</property>
+                                     <property name="fill">False</property>
+                                   </packing>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkLabel" id="fade_label">
+                                     <property name="visible">True</property>
+                                     <property name="label" translatable="yes">F_ade Duration</property>
+                                     <property name="use_underline">True</property>
+                                     <property name="use_markup">False</property>
+                                     <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                     <property name="wrap">False</property>
+                                     <property name="selectable">False</property>
+                                     <property name="xalign">0</property>
+                                     <property name="yalign">0.5</property>
+                                     <property name="xpad">0</property>
+                                     <property name="ypad">0</property>
+                                     <property name="mnemonic_widget">fade_spinbutton</property>
+                                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                     <property name="width_chars">-1</property>
+                                     <property name="single_line_mode">False</property>
+                                     <property name="angle">0</property>
+                                     <accessibility>
+                                       <atkrelation target="fade_spinbutton" type="label-for"/>
+                                       <atkrelation target="fade_spinbutton" type="flows-to"/>
+                                     </accessibility>
+                                   </widget>
+                                   <packing>
+                                     <property name="padding">14</property>
+                                     <property name="expand">False</property>
+                                     <property name="fill">False</property>
+                                   </packing>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkSpinButton" id="fade_spinbutton">
+                                     <property name="visible">True</property>
+                                     <property name="tooltip" translatable="yes">How long it should take for the screen to fade in and out.</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="climb_rate">1</property>
+                                     <property name="digits">0</property>
+                                     <property name="numeric">True</property>
+                                     <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+                                     <property name="snap_to_ticks">True</property>
+                                     <property name="wrap">False</property>
+                                     <property name="adjustment">0 0 10 1 1 0</property>
+                                     <accessibility>
+                                       <atkrelation target="unfade_button" type="controlled-by"/>
+                                       <atkrelation target="fade_button" type="controlled-by"/>
+                                       <atkrelation target="fade_label" type="labelled-by"/>
+                                       <atkrelation target="fade_sec_label" type="labelled-by"/>
+                                       <atkrelation target="fade_label" type="flows-from"/>
+                                       <atkrelation target="fade_sec_label" type="flows-to"/>
+                                     </accessibility>
+                                     <signal name="activate" handler="pref_changed_cb"/>
+                                     <signal name="focus_out_event" handler="pref_changed_event_cb"/>
+                                     <signal name="value_changed" handler="pref_changed_cb"/>
+                                   </widget>
+                                   <packing>
+                                     <property name="padding">4</property>
+                                     <property name="expand">False</property>
+                                     <property name="fill">False</property>
+                                   </packing>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkLabel" id="fade_sec_label">
+                                     <property name="visible">True</property>
+                                     <property name="label" translatable="yes">seconds</property>
+                                     <property name="use_underline">False</property>
+                                     <property name="use_markup">False</property>
+                                     <property name="justify">GTK_JUSTIFY_LEFT</property>
+                                     <property name="wrap">False</property>
+                                     <property name="selectable">False</property>
+                                     <property name="xalign">0</property>
+                                     <property name="yalign">0.5</property>
+                                     <property name="xpad">0</property>
+                                     <property name="ypad">0</property>
+                                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                                     <property name="width_chars">-1</property>
+                                     <property name="single_line_mode">False</property>
+                                     <property name="angle">0</property>
+                                     <accessibility>
+                                       <atkrelation target="fade_spinbutton" type="label-for"/>
+                                       <atkrelation target="fade_spinbutton" type="flows-from"/>
+                                     </accessibility>
+                                   </widget>
+                                   <packing>
+                                     <property name="padding">2</property>
+                                     <property name="expand">False</property>
+                                     <property name="fill">False</property>
+                                   </packing>
+                                 </child>
+                               </widget>
+                               <packing>
+                                 <property name="padding">0</property>
+                                 <property name="expand">False</property>
+                                 <property name="fill">False</property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkHSeparator" id="cmap_hr">
+                                 <property name="visible">True</property>
+                               </widget>
+                               <packing>
+                                 <property name="padding">8</property>
+                                 <property name="expand">False</property>
+                                 <property name="fill">False</property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkCheckButton" id="install_button">
+                                 <property name="visible">True</property>
+                                 <property name="tooltip" translatable="yes">Whether to install a private colormap when running in 8-bit mode on the default Visual.</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="label" translatable="yes">Install _Colormap</property>
+                                 <property name="use_underline">True</property>
+                                 <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <property name="focus_on_click">True</property>
+                                 <property name="active">False</property>
+                                 <property name="inconsistent">False</property>
+                                 <property name="draw_indicator">True</property>
+                                 <signal name="toggled" handler="pref_changed_cb"/>
+                               </widget>
+                               <packing>
+                                 <property name="padding">0</property>
+                                 <property name="expand">False</property>
+                                 <property name="fill">False</property>
+                               </packing>
+                             </child>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">True</property>
+                             <property name="fill">True</property>
+                           </packing>
+                         </child>
+                       </widget>
+                     </child>
+
+                     <child>
+                       <widget class="GtkLabel" id="label5">
+                         <property name="visible">True</property>
+                         <property name="label" translatable="yes">Fading and Colormaps</property>
+                         <property name="use_underline">False</property>
+                         <property name="use_markup">False</property>
+                         <property name="justify">GTK_JUSTIFY_LEFT</property>
+                         <property name="wrap">False</property>
+                         <property name="selectable">False</property>
+                         <property name="xalign">0.5</property>
+                         <property name="yalign">0.5</property>
+                         <property name="xpad">0</property>
+                         <property name="ypad">0</property>
+                         <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                         <property name="width_chars">-1</property>
+                         <property name="single_line_mode">False</property>
+                         <property name="angle">0</property>
+                         <accessibility>
+                           <atkrelation target="cmap_frame" type="label-for"/>
+                         </accessibility>
+                       </widget>
+                       <packing>
+                         <property name="type">label_item</property>
+                       </packing>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="left_attach">1</property>
+                     <property name="right_attach">2</property>
+                     <property name="top_attach">1</property>
+                     <property name="bottom_attach">2</property>
+                     <property name="x_options">fill</property>
+                     <property name="y_options">fill</property>
+                   </packing>
+                 </child>
+               </widget>
+               <packing>
+                 <property name="tab_expand">False</property>
+                 <property name="tab_fill">True</property>
+               </packing>
+             </child>
+
+             <child>
+               <widget class="GtkLabel" id="options_tab">
+                 <property name="visible">True</property>
+                 <property name="label" translatable="yes">_Advanced</property>
+                 <property name="use_underline">True</property>
+                 <property name="use_markup">False</property>
+                 <property name="justify">GTK_JUSTIFY_LEFT</property>
+                 <property name="wrap">False</property>
+                 <property name="selectable">False</property>
+                 <property name="xalign">0.5</property>
+                 <property name="yalign">0.5</property>
+                 <property name="xpad">0</property>
+                 <property name="ypad">0</property>
+                 <property name="mnemonic_widget">notebook</property>
+                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                 <property name="width_chars">-1</property>
+                 <property name="single_line_mode">False</property>
+                 <property name="angle">0</property>
+               </widget>
+               <packing>
+                 <property name="type">tab</property>
+               </packing>
+             </child>
+           </widget>
+           <packing>
+             <property name="padding">0</property>
+             <property name="expand">True</property>
+             <property name="fill">True</property>
+           </packing>
+         </child>
+       </widget>
+       <packing>
+         <property name="padding">0</property>
+         <property name="expand">True</property>
+         <property name="fill">True</property>
+       </packing>
+      </child>
+
+      <child>
+       <widget class="GtkHButtonBox" id="hbuttonbox2">
+         <property name="border_width">5</property>
+         <property name="layout_style">GTK_BUTTONBOX_EDGE</property>
+         <property name="spacing">10</property>
+
+         <child>
+           <widget class="GtkButton" id="helpbutton">
+             <property name="visible">True</property>
+             <property name="can_default">True</property>
+             <property name="can_focus">True</property>
+             <property name="label">gtk-help</property>
+             <property name="use_stock">True</property>
+             <property name="relief">GTK_RELIEF_NORMAL</property>
+             <property name="focus_on_click">True</property>
+             <signal name="clicked" handler="doc_menu_cb"/>
+           </widget>
+         </child>
+
+         <child>
+           <widget class="GtkButton" id="closebutton">
+             <property name="visible">True</property>
+             <property name="can_default">True</property>
+             <property name="can_focus">True</property>
+             <property name="label">gtk-close</property>
+             <property name="use_stock">True</property>
+             <property name="relief">GTK_RELIEF_NORMAL</property>
+             <property name="focus_on_click">True</property>
+             <signal name="clicked" handler="exit_menu_cb"/>
+           </widget>
+         </child>
+       </widget>
+       <packing>
+         <property name="padding">0</property>
+         <property name="expand">False</property>
+         <property name="fill">True</property>
+         <property name="pack_type">GTK_PACK_END</property>
+       </packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkDialog" id="xscreensaver_settings_dialog">
+  <property name="title" translatable="yes">dialog1</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+  @COMMENT_DEMO_GLADE2_GTK_2_22_HEAD@<property name="has_separator">False</property>@COMMENT_DEMO_GLADE2_GTK_2_22_TAIL@
+
+  <child internal-child="vbox">
+    <widget class="GtkVBox" id="dialog_vbox">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">0</property>
+
+      <child internal-child="action_area">
+       <widget class="GtkHButtonBox" id="dialog_action_area">
+         <property name="visible">True</property>
+         <property name="layout_style">GTK_BUTTONBOX_END</property>
+
+         <child>
+           <widget class="GtkButton" id="adv_button">
+             <property name="visible">True</property>
+             <property name="can_default">True</property>
+             <property name="can_focus">True</property>
+             <property name="label" translatable="yes">_Advanced &gt;&gt;</property>
+             <property name="use_underline">True</property>
+             <property name="relief">GTK_RELIEF_NORMAL</property>
+             <property name="focus_on_click">True</property>
+             <property name="response_id">0</property>
+             <signal name="clicked" handler="settings_adv_cb"/>
+           </widget>
+         </child>
+
+         <child>
+           <widget class="GtkButton" id="std_button">
+             <property name="visible">True</property>
+             <property name="can_default">True</property>
+             <property name="can_focus">True</property>
+             <property name="label" translatable="yes">_Standard &lt;&lt;</property>
+             <property name="use_underline">True</property>
+             <property name="relief">GTK_RELIEF_NORMAL</property>
+             <property name="focus_on_click">True</property>
+             <property name="response_id">0</property>
+             <signal name="clicked" handler="settings_std_cb"/>
+           </widget>
+         </child>
+
+         <child>
+           <widget class="GtkButton" id="reset_button">
+             <property name="visible">True</property>
+             <property name="can_default">True</property>
+             <property name="can_focus">True</property>
+             <property name="label" translatable="yes">_Reset to Defaults</property>
+             <property name="use_underline">True</property>
+             <property name="relief">GTK_RELIEF_NORMAL</property>
+             <property name="focus_on_click">True</property>
+             <property name="response_id">0</property>
+             <signal name="clicked" handler="settings_reset_cb"/>
+           </widget>
+         </child>
+
+         <child>
+           <widget class="GtkButton" id="cancel_button">
+             <property name="visible">True</property>
+             <property name="can_default">True</property>
+             <property name="can_focus">True</property>
+             <property name="label">gtk-cancel</property>
+             <property name="use_stock">True</property>
+             <property name="relief">GTK_RELIEF_NORMAL</property>
+             <property name="focus_on_click">True</property>
+             <property name="response_id">-6</property>
+             <signal name="clicked" handler="settings_cancel_cb"/>
+           </widget>
+         </child>
+
+         <child>
+           <widget class="GtkButton" id="ok_button">
+             <property name="visible">True</property>
+             <property name="can_default">True</property>
+             <property name="can_focus">True</property>
+             <property name="label">gtk-ok</property>
+             <property name="use_stock">True</property>
+             <property name="relief">GTK_RELIEF_NORMAL</property>
+             <property name="focus_on_click">True</property>
+             <property name="response_id">-5</property>
+             <signal name="clicked" handler="settings_ok_cb"/>
+           </widget>
+         </child>
+       </widget>
+       <packing>
+         <property name="padding">0</property>
+         <property name="expand">False</property>
+         <property name="fill">True</property>
+         <property name="pack_type">GTK_PACK_END</property>
+       </packing>
+      </child>
+
+      <child>
+       <widget class="GtkVBox" id="vbox1">
+         <property name="visible">True</property>
+         <property name="homogeneous">False</property>
+         <property name="spacing">0</property>
+
+         <child>
+           <widget class="GtkFrame" id="opt_frame">
+             <property name="visible">True</property>
+             <property name="label_xalign">0</property>
+             <property name="label_yalign">0</property>
+             <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+             <accessibility>
+               <atkrelation target="label6" type="labelled-by"/>
+             </accessibility>
+
+             <child>
+               <widget class="GtkNotebook" id="opt_notebook">
+                 <property name="border_width">12</property>
+                 <property name="visible">True</property>
+                 <property name="can_focus">True</property>
+                 <property name="show_tabs">True</property>
+                 <property name="show_border">False</property>
+                 <property name="tab_pos">GTK_POS_BOTTOM</property>
+                 <property name="scrollable">False</property>
+                 <property name="enable_popup">False</property>
+                 <signal name="switch_page" handler="settings_switch_page_cb"/>
+
+                 <child>
+                   <widget class="GtkVBox" id="settings_vbox">
+                     <property name="visible">True</property>
+                     <property name="homogeneous">False</property>
+                     <property name="spacing">0</property>
+
+                     <child>
+                       <placeholder/>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="tab_expand">True</property>
+                     <property name="tab_fill">True</property>
+                     <property name="tab_pack">GTK_PACK_END</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkLabel" id="std_label">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">Standard</property>
+                     <property name="use_underline">False</property>
+                     <property name="use_markup">False</property>
+                     <property name="justify">GTK_JUSTIFY_LEFT</property>
+                     <property name="wrap">False</property>
+                     <property name="selectable">False</property>
+                     <property name="xalign">0.5</property>
+                     <property name="yalign">0.5</property>
+                     <property name="xpad">0</property>
+                     <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
+                   </widget>
+                   <packing>
+                     <property name="type">tab</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkTable" id="adv_table">
+                     <property name="visible">True</property>
+                     <property name="n_rows">4</property>
+                     <property name="n_columns">2</property>
+                     <property name="homogeneous">False</property>
+                     <property name="row_spacing">0</property>
+                     <property name="column_spacing">0</property>
+
+                     <child>
+                       <widget class="GtkImage" id="cmd_logo">
+                         <property name="visible">True</property>
+                         <property name="pixbuf">screensaver-cmndln.png</property>
+                         <property name="xalign">0.5</property>
+                         <property name="yalign">0.5</property>
+                         <property name="xpad">4</property>
+                         <property name="ypad">8</property>
+                       </widget>
+                       <packing>
+                         <property name="left_attach">0</property>
+                         <property name="right_attach">1</property>
+                         <property name="top_attach">0</property>
+                         <property name="bottom_attach">1</property>
+                         <property name="x_options">fill</property>
+                         <property name="y_options">fill</property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkLabel" id="cmd_label">
+                         <property name="visible">True</property>
+                         <property name="label" translatable="yes">_Command Line:</property>
+                         <property name="use_underline">True</property>
+                         <property name="use_markup">False</property>
+                         <property name="justify">GTK_JUSTIFY_LEFT</property>
+                         <property name="wrap">False</property>
+                         <property name="selectable">False</property>
+                         <property name="xalign">0</property>
+                         <property name="yalign">0.5</property>
+                         <property name="xpad">0</property>
+                         <property name="ypad">0</property>
+                         <property name="mnemonic_widget">cmd_text</property>
+                         <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                         <property name="width_chars">-1</property>
+                         <property name="single_line_mode">False</property>
+                         <property name="angle">0</property>
+                         <accessibility>
+                           <atkrelation target="cmd_text" type="label-for"/>
+                         </accessibility>
+                       </widget>
+                       <packing>
+                         <property name="left_attach">1</property>
+                         <property name="right_attach">2</property>
+                         <property name="top_attach">1</property>
+                         <property name="bottom_attach">2</property>
+                         <property name="x_options">fill</property>
+                         <property name="y_options"></property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkEntry" id="cmd_text">
+                         <property name="visible">True</property>
+                         <property name="can_focus">True</property>
+                         <property name="editable">True</property>
+                         <property name="visibility">True</property>
+                         <property name="max_length">0</property>
+                         <property name="text" translatable="yes"></property>
+                         <property name="has_frame">True</property>
+                         <property name="invisible_char">*</property>
+                         <property name="activates_default">False</property>
+                         <accessibility>
+                           <atkrelation target="cmd_label" type="labelled-by"/>
+                         </accessibility>
+                       </widget>
+                       <packing>
+                         <property name="left_attach">1</property>
+                         <property name="right_attach">2</property>
+                         <property name="top_attach">2</property>
+                         <property name="bottom_attach">3</property>
+                         <property name="y_options"></property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkHBox" id="visual_hbox">
+                         <property name="visible">True</property>
+                         <property name="homogeneous">False</property>
+                         <property name="spacing">0</property>
+
+                         <child>
+                           <widget class="GtkLabel" id="visual">
+                             <property name="visible">True</property>
+                             <property name="label" translatable="yes">_Visual:</property>
+                             <property name="use_underline">True</property>
+                             <property name="use_markup">False</property>
+                             <property name="justify">GTK_JUSTIFY_LEFT</property>
+                             <property name="wrap">False</property>
+                             <property name="selectable">False</property>
+                             <property name="xalign">1</property>
+                             <property name="yalign">0.5</property>
+                             <property name="xpad">3</property>
+                             <property name="ypad">0</property>
+                             <property name="mnemonic_widget">visual_entry</property>
+                             <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                             <property name="width_chars">-1</property>
+                             <property name="single_line_mode">False</property>
+                             <property name="angle">0</property>
+                             <accessibility>
+                               <atkrelation target="visual_combo" type="label-for"/>
+                             </accessibility>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">False</property>
+                             <property name="fill">False</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkCombo" id="visual_combo">
+                             <property name="visible">True</property>
+                             <property name="value_in_list">False</property>
+                             <property name="allow_empty">True</property>
+                             <property name="case_sensitive">False</property>
+                             <property name="enable_arrow_keys">True</property>
+                             <property name="enable_arrows_always">False</property>
+                             <accessibility>
+                               <atkrelation target="visual" type="labelled-by"/>
+                             </accessibility>
+
+                             <child internal-child="entry">
+                               <widget class="GtkEntry" id="visual_entry">
+                                 <property name="visible">True</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="editable">True</property>
+                                 <property name="visibility">True</property>
+                                 <property name="max_length">0</property>
+                                 <property name="text" translatable="yes"></property>
+                                 <property name="has_frame">True</property>
+                                 <property name="invisible_char">*</property>
+                                 <property name="activates_default">False</property>
+                               </widget>
+                             </child>
+
+                             <child internal-child="list">
+                               <widget class="GtkList" id="combo-list1">
+                                 <property name="visible">True</property>
+                                 <property name="selection_mode">GTK_SELECTION_BROWSE</property>
+
+                                 <child>
+                                   <widget class="GtkListItem" id="listitem25">
+                                     <property name="visible">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="label" translatable="yes">Any</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkListItem" id="listitem26">
+                                     <property name="visible">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="label" translatable="yes">Best</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkListItem" id="listitem27">
+                                     <property name="visible">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="label" translatable="yes">Default</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkListItem" id="listitem28">
+                                     <property name="visible">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="label" translatable="yes">Default-N</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkListItem" id="listitem29">
+                                     <property name="visible">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="label" translatable="yes">GL</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkListItem" id="listitem30">
+                                     <property name="visible">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="label" translatable="yes">TrueColor</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkListItem" id="listitem31">
+                                     <property name="visible">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="label" translatable="yes">PseudoColor</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkListItem" id="listitem32">
+                                     <property name="visible">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="label" translatable="yes">StaticGray</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkListItem" id="listitem33">
+                                     <property name="visible">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="label" translatable="yes">GrayScale</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkListItem" id="listitem34">
+                                     <property name="visible">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="label" translatable="yes">DirectColor</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkListItem" id="listitem35">
+                                     <property name="visible">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="label" translatable="yes">Color</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkListItem" id="listitem36">
+                                     <property name="visible">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="label" translatable="yes">Gray</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkListItem" id="listitem37">
+                                     <property name="visible">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="label" translatable="yes">Mono</property>
+                                   </widget>
+                                 </child>
+                               </widget>
+                             </child>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">False</property>
+                             <property name="fill">False</property>
+                           </packing>
+                         </child>
+                       </widget>
+                       <packing>
+                         <property name="left_attach">1</property>
+                         <property name="right_attach">2</property>
+                         <property name="top_attach">3</property>
+                         <property name="bottom_attach">4</property>
+                         <property name="x_options">fill</property>
+                         <property name="y_options">fill</property>
+                       </packing>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="tab_expand">False</property>
+                     <property name="tab_fill">True</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkLabel" id="adv_label">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">Advanced</property>
+                     <property name="use_underline">False</property>
+                     <property name="use_markup">False</property>
+                     <property name="justify">GTK_JUSTIFY_LEFT</property>
+                     <property name="wrap">False</property>
+                     <property name="selectable">False</property>
+                     <property name="xalign">0.5</property>
+                     <property name="yalign">0.5</property>
+                     <property name="xpad">0</property>
+                     <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
+                   </widget>
+                   <packing>
+                     <property name="type">tab</property>
+                   </packing>
+                 </child>
+               </widget>
+             </child>
+
+             <child>
+               <widget class="GtkLabel" id="label6">
+                 <property name="visible">True</property>
+                 <property name="label" translatable="yes">Settings</property>
+                 <property name="use_underline">False</property>
+                 <property name="use_markup">False</property>
+                 <property name="justify">GTK_JUSTIFY_LEFT</property>
+                 <property name="wrap">False</property>
+                 <property name="selectable">False</property>
+                 <property name="xalign">0.5</property>
+                 <property name="yalign">0.5</property>
+                 <property name="xpad">0</property>
+                 <property name="ypad">0</property>
+                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                 <property name="width_chars">-1</property>
+                 <property name="single_line_mode">False</property>
+                 <property name="angle">0</property>
+                 <accessibility>
+                   <atkrelation target="opt_frame" type="label-for"/>
+                 </accessibility>
+               </widget>
+               <packing>
+                 <property name="type">label_item</property>
+               </packing>
+             </child>
+           </widget>
+           <packing>
+             <property name="padding">0</property>
+             <property name="expand">True</property>
+             <property name="fill">True</property>
+           </packing>
+         </child>
+
+         <child>
+           <widget class="GtkFrame" id="doc_frame">
+             <property name="visible">True</property>
+             <property name="label_xalign">0</property>
+             <property name="label_yalign">0</property>
+             <property name="shadow_type">GTK_SHADOW_NONE</property>
+
+             <child>
+               <widget class="GtkVBox" id="doc_vbox">
+                 <property name="border_width">5</property>
+                 <property name="visible">True</property>
+                 <property name="homogeneous">False</property>
+                 <property name="spacing">5</property>
+
+                 <child>
+                   <widget class="GtkLabel" id="doc">
+                     <property name="visible">True</property>
+                     <property name="can_focus">True</property>
+                     <property name="label" translatable="yes"></property>
+                     <property name="use_underline">False</property>
+                     <property name="use_markup">False</property>
+                     <property name="justify">GTK_JUSTIFY_LEFT</property>
+                     <property name="wrap">True</property>
+                     <property name="selectable">True</property>
+                     <property name="xalign">0</property>
+                     <property name="yalign">0</property>
+                     <property name="xpad">0</property>
+                     <property name="ypad">0</property>
+                     <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                     <property name="width_chars">-1</property>
+                     <property name="single_line_mode">False</property>
+                     <property name="angle">0</property>
+                   </widget>
+                   <packing>
+                     <property name="padding">0</property>
+                     <property name="expand">True</property>
+                     <property name="fill">True</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkHBox" id="hbox1">
+                     <property name="visible">True</property>
+                     <property name="homogeneous">False</property>
+                     <property name="spacing">0</property>
+
+                     <child>
+                       <widget class="GtkButton" id="manual">
+                         <property name="visible">True</property>
+                         <property name="can_focus">True</property>
+                         <property name="label" translatable="yes">_Documentation...</property>
+                         <property name="use_underline">True</property>
+                         <property name="relief">GTK_RELIEF_NORMAL</property>
+                         <property name="focus_on_click">True</property>
+                         <signal name="clicked" handler="manual_cb"/>
+                       </widget>
+                       <packing>
+                         <property name="padding">0</property>
+                         <property name="expand">False</property>
+                         <property name="fill">False</property>
+                         <property name="pack_type">GTK_PACK_END</property>
+                       </packing>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="padding">0</property>
+                     <property name="expand">False</property>
+                     <property name="fill">False</property>
+                   </packing>
+                 </child>
+               </widget>
+             </child>
+
+             <child>
+               <widget class="GtkLabel" id="label7">
+                 <property name="visible">True</property>
+                 <property name="label" translatable="yes"></property>
+                 <property name="use_underline">False</property>
+                 <property name="use_markup">False</property>
+                 <property name="justify">GTK_JUSTIFY_LEFT</property>
+                 <property name="wrap">False</property>
+                 <property name="selectable">False</property>
+                 <property name="xalign">0.5</property>
+                 <property name="yalign">0.5</property>
+                 <property name="xpad">0</property>
+                 <property name="ypad">0</property>
+                 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                 <property name="width_chars">-1</property>
+                 <property name="single_line_mode">False</property>
+                 <property name="angle">0</property>
+               </widget>
+               <packing>
+                 <property name="type">label_item</property>
+               </packing>
+             </child>
+           </widget>
+           <packing>
+             <property name="padding">0</property>
+             <property name="expand">False</property>
+             <property name="fill">False</property>
+           </packing>
+         </child>
+       </widget>
+       <packing>
+         <property name="padding">0</property>
+         <property name="expand">True</property>
+         <property name="fill">True</property>
+       </packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+</glade-interface>
index 6162b78deb9ac93b76fca20750427eb9526f0780..fa5e20c149fbc4a7ba51d29de6052fe52c2abbe9 100755 (executable)
@@ -28,13 +28,16 @@ use strict;
 # Only error out if we're actually loading a URL instead of local data.
 BEGIN { eval 'use LWP::UserAgent;' }
 
+# Not sure how prevalent this is. Hope it's part of the default install.
+BEGIN { eval 'use HTML::Entities;' }
+
 use Socket;
 use POSIX qw(strftime);
 use Text::Wrap qw(wrap);
 use bytes;
 
 my $progname = $0; $progname =~ s@.*/@@g;
-my ($version) = ('$Revision: 1.33 $' =~ m/\s(\d[.\d]+)\s/s);
+my ($version) = ('$Revision: 1.37 $' =~ m/\s(\d[.\d]+)\s/s);
 
 my $verbose = 0;
 my $http_proxy = undef;
@@ -49,141 +52,63 @@ my $text_url      = 'http://en.wikipedia.org/w/index.php?title=Special:NewPages&
 
 my $wrap_columns   = undef;
 my $truncate_lines = undef;
+my $latin1_p = 0;
 my $nyarlathotep_p = 0;
 
 
-# Maps HTML character entities to the corresponding Latin1 characters.
-#
-my %entity_table = (
-   "quot"   => '"',    "amp"    => '&',    "lt"     => '<',
-   "gt"     => '>',    "nbsp"   => " ",    "iexcl"  => "\xA1",
-   "cent"   => "\xA2", "pound"  => "\xA3", "curren" => "\xA4",
-   "yen"    => "\xA5", "brvbar" => "\xA6", "sect"   => "\xA7",
-   "uml"    => "\xA8", "copy"   => "\xA9", "ordf"   => "\xAA",
-   "laquo"  => "\xAB", "not"    => "\xAC", "shy"    => "\xAD",
-   "reg"    => "\xAE", "macr"   => "\xAF", "deg"    => "\xB0",
-   "plusmn" => "\xB1", "sup2"   => "\xB2", "sup3"   => "\xB3",
-   "acute"  => "\xB4", "micro"  => "\xB5", "para"   => "\xB6",
-   "middot" => "\xB7", "cedil"  => "\xB8", "sup1"   => "\xB9",
-   "ordm"   => "\xBA", "raquo"  => "\xBB", "frac14" => "\xBC",
-   "frac12" => "\xBD", "frac34" => "\xBE", "iquest" => "\xBF",
-   "Agrave" => "\xC0", "Aacute" => "\xC1", "Acirc"  => "\xC2",
-   "Atilde" => "\xC3", "Auml"   => "\xC4", "Aring"  => "\xC5",
-   "AElig"  => "\xC6", "Ccedil" => "\xC7", "Egrave" => "\xC8",
-   "Eacute" => "\xC9", "Ecirc"  => "\xCA", "Euml"   => "\xCB",
-   "Igrave" => "\xCC", "Iacute" => "\xCD", "Icirc"  => "\xCE",
-   "Iuml"   => "\xCF", "ETH"    => "\xD0", "Ntilde" => "\xD1",
-   "Ograve" => "\xD2", "Oacute" => "\xD3", "Ocirc"  => "\xD4",
-   "Otilde" => "\xD5", "Ouml"   => "\xD6", "times"  => "\xD7",
-   "Oslash" => "\xD8", "Ugrave" => "\xD9", "Uacute" => "\xDA",
-   "Ucirc"  => "\xDB", "Uuml"   => "\xDC", "Yacute" => "\xDD",
-   "THORN"  => "\xDE", "szlig"  => "\xDF", "agrave" => "\xE0",
-   "aacute" => "\xE1", "acirc"  => "\xE2", "atilde" => "\xE3",
-   "auml"   => "\xE4", "aring"  => "\xE5", "aelig"  => "\xE6",
-   "ccedil" => "\xE7", "egrave" => "\xE8", "eacute" => "\xE9",
-   "ecirc"  => "\xEA", "euml"   => "\xEB", "igrave" => "\xEC",
-   "iacute" => "\xED", "icirc"  => "\xEE", "iuml"   => "\xEF",
-   "eth"    => "\xF0", "ntilde" => "\xF1", "ograve" => "\xF2",
-   "oacute" => "\xF3", "ocirc"  => "\xF4", "otilde" => "\xF5",
-   "ouml"   => "\xF6", "divide" => "\xF7", "oslash" => "\xF8",
-   "ugrave" => "\xF9", "uacute" => "\xFA", "ucirc"  => "\xFB",
-   "uuml"   => "\xFC", "yacute" => "\xFD", "thorn"  => "\xFE",
-   "yuml"   => "\xFF", "apos"   => "\'",
-
-   # HTML 4 entities that do not have 1:1 Latin1 mappings.
-   "bull"  => "*",    "hellip"=> "...",  "prime" => "'",  "Prime" => "\"",
-   "frasl" => "/",    "trade" => "[tm]", "larr"  => "<-", "rarr"  => "->",
-   "harr"  => "<->",  "lArr"  => "<=",   "rArr"  => "=>", "hArr"  => "<=>",
-   "empty" => "\xD8", "minus" => "-",    "lowast"=> "*",  "sim"   => "~",
-   "cong"  => "=~",   "asymp" => "~",    "ne"    => "!=", "equiv" => "==",
-   "le"    => "<=",   "ge"    => ">=",   "lang"  => "<",  "rang"  => ">",
-   "loz"   => "<>",   "OElig" => "OE",   "oelig" => "oe", "Yuml"  => "Y",
-   "circ"  => "^",    "tilde" => "~",    "ensp"  => " ",  "emsp"  => " ",
-   "thinsp"=> " ",    "ndash" => "-",    "mdash" => "-",  "lsquo" => "`",
-   "rsquo" => "'",    "sbquo" => "'",    "ldquo" => "\"", "rdquo" => "\"",
-   "bdquo" => "\"",   "lsaquo"=> "<",    "rsaquo"=> ">",
-);
-
-# Maps certain UTF8 characters (2 or 3 bytes) to the corresponding
-# Latin1 characters.
-#
-my %unicode_latin1_table = (
-   "\xC2\xA1" => "\xA1", "\xC2\xA2" => "\xA2", "\xC2\xA3" => "\xA3",
-   "\xC2\xA4" => "\xA4", "\xC2\xA5" => "\xA5", "\xC2\xA6" => "\xA6",
-   "\xC2\xA7" => "\xA7", "\xC2\xA8" => "\xA8", "\xC2\xA9" => "\xA9",
-   "\xC2\xAA" => "\xAA", "\xC2\xAB" => "\xAB", "\xC2\xAC" => "\xAC",
-   "\xC2\xAD" => "\xAD", "\xC2\xAE" => "\xAE", "\xC2\xAF" => "\xAF",
-   "\xC2\xB0" => "\xB0", "\xC2\xB1" => "\xB1", "\xC2\xB2" => "\xB2",
-   "\xC2\xB3" => "\xB3", "\xC2\xB4" => "\xB4", "\xC2\xB5" => "\xB5",
-   "\xC2\xB6" => "\xB6", "\xC2\xB7" => "\xB7", "\xC2\xB8" => "\xB8",
-   "\xC2\xB9" => "\xB9", "\xC2\xBA" => "\xBA", "\xC2\xBB" => "\xBB",
-   "\xC2\xBC" => "\xBC", "\xC2\xBD" => "\xBD", "\xC2\xBE" => "\xBE",
-   "\xC2\xBF" => "\xBF", "\xC3\x80" => "\xC0", "\xC3\x81" => "\xC1",
-   "\xC3\x82" => "\xC2", "\xC3\x83" => "\xC3", "\xC3\x84" => "\xC4",
-   "\xC3\x85" => "\xC5", "\xC3\x86" => "\xC6", "\xC3\x87" => "\xC7",
-   "\xC3\x88" => "\xC8", "\xC3\x89" => "\xC9", "\xC3\x8A" => "\xCA",
-   "\xC3\x8B" => "\xCB", "\xC3\x8C" => "\xCC", "\xC3\x8D" => "\xCD",
-   "\xC3\x8E" => "\xCE", "\xC3\x8F" => "\xCF", "\xC3\x90" => "\xD0",
-   "\xC3\x91" => "\xD1", "\xC3\x92" => "\xD2", "\xC3\x93" => "\xD3",
-   "\xC3\x94" => "\xD4", "\xC3\x95" => "\xD5", "\xC3\x96" => "\xD6",
-   "\xC3\x97" => "\xD7", "\xC3\x98" => "\xD8", "\xC3\x99" => "\xD9",
-   "\xC3\x9A" => "\xDA", "\xC3\x9B" => "\xDB", "\xC3\x9C" => "\xDC",
-   "\xC3\x9D" => "\xDD", "\xC3\x9E" => "\xDE", "\xC3\x9F" => "\xDF",
-   "\xC3\xA0" => "\xE0", "\xC3\xA1" => "\xE1", "\xC3\xA2" => "\xE2",
-   "\xC3\xA3" => "\xE3", "\xC3\xA4" => "\xE4", "\xC3\xA5" => "\xE5",
-   "\xC3\xA6" => "\xE6", "\xC3\xA7" => "\xE7", "\xC3\xA8" => "\xE8",
-   "\xC3\xA9" => "\xE9", "\xC3\xAA" => "\xEA", "\xC3\xAB" => "\xEB",
-   "\xC3\xAC" => "\xEC", "\xC3\xAD" => "\xED", "\xC3\xAE" => "\xEE",
-   "\xC3\xAF" => "\xEF", "\xC3\xB0" => "\xF0", "\xC3\xB1" => "\xF1",
-   "\xC3\xB2" => "\xF2", "\xC3\xB3" => "\xF3", "\xC3\xB4" => "\xF4",
-   "\xC3\xB5" => "\xF5", "\xC3\xB6" => "\xF6", "\xC3\xB7" => "\xF7",
-   "\xC3\xB8" => "\xF8", "\xC3\xB9" => "\xF9", "\xC3\xBA" => "\xFA",
-   "\xC3\xBB" => "\xFB", "\xC3\xBC" => "\xFC", "\xC3\xBD" => "\xFD",
-   "\xC3\xBE" => "\xFE", "\xC3\xBF" => "\xFF",
-
-   "\xE2\x80\x93" => '--',       "\xE2\x80\x94" => '--',
-   "\xE2\x80\x98" => '`',        "\xE2\x80\x99" => '\'',
-   "\xE2\x80\x9C" => "``",       "\xE2\x80\x9D" => "''",
-   "\xE2\x80\xB2" => "'",        "\xE2\x80\xA6" => '...',
-   "\xE2\x86\x90" => ' &larr; ', "\xE2\x84\xA2" => '&trade;',
-   "\xE2\x80\xA2" => '&bull;',   "\xC2\xA0" => ' ',  # &nbsp;
- );
-
 # Convert any HTML entities to Latin1 characters.
 #
 sub de_entify($) {
   my ($text) = @_;
-  $text =~ s/(&(\#)?([[:alpha:]\d]+);?)/
-    {
-     my $c = $3;
-     if (! defined($2)) {
-       $c = $entity_table{$c};         # for &Aacute;
-     } else {
-       if ($c =~ m@^x([\dA-F]+)$@si) { # for &#x41;
-         $c = chr(hex($1));
-       } elsif ($c =~ m@^\d+$@si) {    # for &#65;
-         $c = chr($c);
-       } else {
-         $c = undef;
-       }
-     }
-     ($c || "[$3]");                   # for &unknown; => "[unknown]"
-    }
-   /gexi;
-  return $text;
+
+  return '' unless defined($text);
+  return $text unless ($text =~ m/&/s);
+
+  # Convert any HTML entities to Unicode characters,
+  # if the HTML::Entities module is installed.
+  eval {
+    my $t2 = $text;
+    $text = undef;
+    $text = HTML::Entities::decode_entities ($t2);
+  };
+  return $text if defined($text);
+
+  # If it's not installed, just complain instead of trying to halfass it.
+  print STDOUT ("\n\tPerl is broken. Do this to repair it:\n" .
+                "\n\tsudo cpan HTML::Entities\n\n");
+  exit (1);
 }
 
 
 # Convert any Unicode characters to Latin1 if possible.
 # Unconvertable bytes are left alone.
 #
-sub de_unicoddle($) {
+sub utf8_to_latin1($) {
   my ($text) = @_;
-  foreach my $key (sort { length($b) <=> length($a) }
-                   keys (%unicode_latin1_table)) {
-    my $val = $unicode_latin1_table{$key};
-    $text =~ s/$key/$val/gs;
-  }
+
+  utf8::encode ($text);  # Unpack Unicode back to multi-byte UTF-8.
+
+  # Maybe it would be better to handle this in the Unicode domain
+  # by doing things like s/\x{2018}/\"/g, but without decoding the
+  # string back to UTF-8 first, I'm at a loss as to how to have
+  # "&aacute;" print as "\340" instead of as "\303\240".
+
+  $text =~ s/ \xC2 ( [\xA0-\xFF] ) / $1 /gsex;
+  $text =~ s/ \xC3 ( [\x80-\xFF] ) / chr (ord($1) | 0x40) /gsex;
+
+  # Handles a few 3-byte sequences too.
+  $text =~ s/\xE2\x80\x93/--/gs;
+  $text =~ s/\xE2\x80\x94/--/gs;
+  $text =~ s/\xE2\x80\x98/`/gs;
+  $text =~ s/\xE2\x80\x99/'/gs;
+  $text =~ s/\xE2\x80\x9C/``/gs;
+  $text =~ s/\xE2\x80\x9D/'/gs;
+  $text =~ s/\xE2\x80\xA2/&bull;/gs;
+  $text =~ s/\xE2\x80\xA6/.../gs;
+  $text =~ s/\xE2\x80\xB2/'/gs;
+  $text =~ s/\xE2\x84\xA2/&trade;/gs;
+  $text =~ s/\xE2\x86\x90/ &larr; /gs;
+
   return $text;
 }
 
@@ -361,6 +286,7 @@ sub output() {
 
   if ($text_mode eq 'literal') {
     $text_literal = strftime ($text_literal, localtime);
+    $text_literal = utf8_to_latin1($text_literal) if ($latin1_p);
     $text_literal =~ y/A-Za-z/N-ZA-Mn-za-m/ if ($nyarlathotep_p);
     print STDOUT $text_literal;
     print STDOUT "\n" unless ($text_literal =~ m/\n$/s);
@@ -381,6 +307,7 @@ sub output() {
       } else {
         # stream it by lines
         while (<$in>) { 
+          $_ = utf8_to_latin1($_) if ($latin1_p);
           y/A-Za-z/N-ZA-Mn-za-m/ if ($nyarlathotep_p);
           print STDOUT $_;
         }
@@ -438,7 +365,8 @@ sub output() {
 
     if (-f "/usr/sbin/system_profiler") {   # "Mac OS X 10.4.5 (8H14)"
       my $sp =                             # "iMac G5"
-        `/usr/sbin/system_profiler SPSoftwareDataType SPHardwareDataType`;
+        `/usr/sbin/system_profiler SPSoftwareDataType SPHardwareDataType 2>/dev/null`;
+      # system_profiler on OS X 10.10 generates spurious error messages.
       my ($v) = ($sp =~ m/^\s*System Version:\s*(.*)$/mi);
       my ($s) = ($sp =~ m/^\s*(?:CPU|Processor) Speed:\s*(.*)$/mi);
       my ($t) = ($sp =~ m/^\s*(?:Machine|Model) Name:\s*(.*)$/mi);
@@ -511,6 +439,10 @@ sub reformat_html($$) {
     s@[\r\n]@ @gsi;
   }
 
+  # This right here is the part where I doom us all to inhuman
+  # toil for the One whose Name cannot be expressed in the
+  # Basic Multilingual Plane. http://jwz.org/b/yhAT He comes.
+
   s@<!--.*?-->@@gsi;                            # lose comments
   s@<(STYLE|SCRIPT)\b[^<>]*>.*?</\1\s*>@@gsi;    # lose css and js
 
@@ -529,8 +461,10 @@ sub reformat_html($$) {
   #
   if ($rss_p eq 'wiki') {
 
+    s@<!--.*?-->@@gsi;                          # lose HTML comments again
+
     # Creation line is often truncated: screws up parsing with unbalanced {{.
-    s@(: +<- +Created page) with [^\n]+@$1@s;
+    s@(: +[^a-zA-Z ]* *Created page) with [^\n]+@$1@s;
 
     s@/\*.*?\*/@@si;                              # /* ... */
 
@@ -563,12 +497,16 @@ sub reformat_html($$) {
 
     # Omit trailing headlines with no text after them (e.g. == Notes ==)
     1 while (s/\n==+[ \t]*[^\n=]+[ \t]*==+\s*$/\n/s);
+
+    $_ = de_entify ($_);            # convert HTML entities, again
   }
 
 
-  # elide any remaining non-Latin1 binary data...
-  s/([^\000-\176]+(\s*[^\000-\176]+)[^a-z\d]*)/\xAB...\xBB /g;
-# s/([^\000-\176]+(\s*[^\000-\176]+)[^a-z\d]*)/\xAB$1\xBB /g;
+  # elide any remaining non-Latin1 binary data.
+  if ($latin1_p) {
+    utf8::encode ($_);  # Unpack Unicode back to multi-byte UTF-8.
+    s/([^\000-\176]+(\s*[^\000-\176]+)[^a-z\d]*)/\xAB...\xBB /g;
+  }
 
   $_ .= "\n";
 
@@ -588,6 +526,7 @@ sub reformat_html($$) {
     s/^(([^\n]*\n){$truncate_lines}).*$/$1/s;
   }
 
+  $_ = utf8_to_latin1($_) if ($latin1_p);
   y/A-Za-z/N-ZA-Mn-za-m/ if ($nyarlathotep_p);
 
   return $_;
@@ -683,7 +622,6 @@ sub rss_field_to_html($) {
     $body = de_entify ($body);      # convert entities to get HTML from XML
   }
 
-  $body = de_unicoddle ($body);     # convert UTF8 to Latin1
   return $body;
 }
 
@@ -705,6 +643,7 @@ sub reformat_text($) {
     $body =~ s/^(([^\n]*\n){$truncate_lines}).*$/$1/s;
   }
 
+  $body = utf8_to_latin1($body) if ($latin1_p);
   $body =~ y/A-Za-z/N-ZA-Mn-za-m/ if ($nyarlathotep_p);
   return $body;
 }
@@ -763,6 +702,8 @@ sub get_url_text($) {
     $ct = 'text/plain';
   }
 
+  utf8::decode ($body);  # Pack multi-byte UTF-8 back into wide chars.
+
   $ct = guess_content_type ($ct, $body);
   if ($ct eq 'html') {
     print STDERR "$progname: converting HTML...\n" if ($verbose > 2);
@@ -813,6 +754,8 @@ sub usage() {
     "       --cols N         Wrap lines at this column.  Default 72.\n" .
     "\n" .
     "       --lines N        No more than N lines of output.\n" .
+    "\n" .
+    "       --latin1         Emit Latin1 instead of UTF-8.\n" .
     "\n");
   exit 1;
 }
@@ -843,6 +786,7 @@ sub main() {
     elsif (m/^--?col(umn)?s?$/) { $wrap_columns = 0 + shift @ARGV; }
     elsif (m/^--?lines?$/)  { $truncate_lines = 0 + shift @ARGV; }
     elsif (m/^--?cocoa$/)   { $cocoa_id = shift @ARGV; }
+    elsif (m/^--?latin1$/)  { $latin1_p++; }
     elsif (m/^--?nyarlathotep$/) { $nyarlathotep_p++; }
     elsif (m/^-./) { usage; }
     else { usage; }
index 4526f27247380f6ebbbe0557d66e7e62663d38fa..d2dbeb9227759a4c14478579357a0b3914f33d39 100644 (file)
@@ -1526,7 +1526,7 @@ main (int argc, char **argv)
   if (p->verbose_p) analyze_display (si);
   initialize_server_extensions (si);
 
-  si->blank_time = time ((time_t) 0); /* must be before ..._window */
+  si->blank_time = time ((time_t *) 0); /* must be before ..._window */
   initialize_screensaver_window (si);
 
   select_events (si);
index f0c272f5dad66343dc62f6795041dabbd1d5960b..8d5f892ceaa1dd3ab8b02bf6c37053edf8ea55cb 100644 (file)
@@ -50,13 +50,14 @@ X_LIBS              = @X_LIBS@
 X_PRE_LIBS     = @X_PRE_LIBS@
 X_EXTRA_LIBS   = @X_EXTRA_LIBS@
 XMU_LIBS       = @XMU_LIBS@
+XFT_LIBS       = @XFT_LIBS@
 
 # Note: see comment in ../driver/Makefile.in for explanation of X_LIBS, etc.
 #
 HACK_PRE       = $(LIBS) $(X_LIBS)
-HACK_POST     = $(X_PRE_LIBS) -lXt -lX11 $(XMU_LIBS) -lXext $(X_EXTRA_LIBS) -lm
-HACK_LIBS      = $(HACK_PRE)            @HACK_LIBS@ $(HACK_POST)
-XPM_LIBS       = $(HACK_PRE) @XPM_LIBS@ @HACK_LIBS@ $(HACK_POST)
+HACK_POST     = $(X_PRE_LIBS) $(XFT_LIBS) -lXt -lX11 $(XMU_LIBS) -lXext $(X_EXTRA_LIBS) -lm
+HACK_LIBS      = $(HACK_PRE) @ANIM_LIBS@ @HACK_LIBS@ $(HACK_POST)
+XPM_LIBS       = $(HACK_PRE) @XPM_LIBS@  @HACK_LIBS@ $(HACK_POST)
 JPEG_LIBS      = @JPEG_LIBS@
 XLOCK_LIBS     = $(HACK_LIBS)
 TEXT_LIBS      = @PTY_LIBS@
@@ -83,12 +84,13 @@ UTIL_OBJS   = $(UTILS_BIN)/alpha.o $(UTILS_BIN)/colors.o \
                  $(UTILS_BIN)/hsv.o $(UTILS_BIN)/resources.o \
                  $(UTILS_BIN)/spline.o $(UTILS_BIN)/usleep.o \
                  $(UTILS_BIN)/visual.o $(UTILS_BIN)/logo.o \
-                 $(UTILS_SRC)/minixpm.c \
+                 $(UTILS_SRC)/minixpm.o \
                  $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/erase.o \
                  $(UTILS_BIN)/xshm.o $(UTILS_BIN)/xdbe.o \
                  $(UTILS_BIN)/colorbars.o \
                  $(UTILS_SRC)/textclient.o $(UTILS_SRC)/aligned_malloc.o \
-                 $(UTILS_SRC)/thread_util.o
+                 $(UTILS_SRC)/thread_util.o \
+                 $(UTILS_SRC)/xft.o $(UTILS_SRC)/utf8wc.o
 
 SRCS           = attraction.c blitspin.c bouboule.c braid.c bubbles.c \
                  bubbles-default.c decayscreen.c deco.c drift.c flag.c \
@@ -119,7 +121,7 @@ SRCS                = attraction.c blitspin.c bouboule.c braid.c bubbles.c \
                  intermomentary.c fireworkx.c fiberlamp.c \
                  boxfit.c interaggregate.c celtic.c cwaves.c m6502.c \
                  asm6502.c abstractile.c lcdscrub.c hexadrop.c \
-                 tessellimage.c delaunay.c \
+                 tessellimage.c delaunay.c recanim.c binaryring.c \
                  webcollage-cocoa.m webcollage-helper-cocoa.m
 SCRIPTS                = vidwhacker webcollage ljlatest
 
@@ -159,7 +161,8 @@ OBJS                = attraction.o blitspin.o bouboule.o braid.o bubbles.o \
                  intermomentary.o fireworkx.o fiberlamp.o boxfit.o \
                  interaggregate.o celtic.o cwaves.o webcollage-cocoa.o \
                  webcollage-helper-cocoa.o m6502.o asm6502.o abstractile.o \
-                 lcdscrub.o hexadrop.o tessellimage.o delaunay.o
+                 lcdscrub.o hexadrop.o tessellimage.o delaunay.o recanim.o \
+                 binaryring.o
 
 EXES           = attraction blitspin bouboule braid decayscreen deco \
                  drift flame galaxy grav greynetic halo \
@@ -181,7 +184,7 @@ EXES                = attraction blitspin bouboule braid decayscreen deco \
                  pacman fuzzyflakes anemotaxis memscroller substrate \
                  intermomentary fireworkx fiberlamp boxfit interaggregate \
                  celtic cwaves m6502 abstractile lcdscrub hexadrop \
-                 tessellimage \
+                 tessellimage binaryring \
                  @JPEG_EXES@
 JPEG_EXES      = webcollage-helper
 
@@ -190,19 +193,22 @@ RETIRED_EXES      = ant bubbles critical flag forest hyperball hypercube laser \
                  whirlygig worm xsublim juggle
 
 HACK_OBJS_1    = fps.o $(UTILS_BIN)/resources.o $(UTILS_BIN)/visual.o \
-                 $(UTILS_BIN)/usleep.o $(UTILS_BIN)/yarandom.o @XMU_OBJS@
+                 $(UTILS_BIN)/usleep.o $(UTILS_BIN)/yarandom.o \
+                 $(UTILS_BIN)/utf8wc.o @XMU_OBJS@ @XFT_OBJS@ @ANIM_OBJS@
 HACK_OBJS      = screenhack.o $(HACK_OBJS_1)
 XLOCK_OBJS     = screenhack.o xlockmore.o $(COLOR_OBJS) $(HACK_OBJS_1)
 COLOR_OBJS     = $(UTILS_BIN)/hsv.o $(UTILS_BIN)/colors.o
 GRAB_OBJS      = $(UTILS_BIN)/grabclient.o
 XSHM_OBJS      = $(UTILS_BIN)/xshm.o
 XDBE_OBJS      = $(UTILS_BIN)/xdbe.o
+ANIM_OBJS      = recanim.o
+ANIM_LIBS      = @XPM_LIBS@
 THREAD_OBJS    = $(UTILS_BIN)/aligned_malloc.o $(UTILS_BIN)/thread_util.o
 
 HDRS           = screenhack.h screenhackI.h fps.h fpsI.h xlockmore.h \
                  xlockmoreI.h automata.h bubbles.h xpm-pixmap.h \
                  apple2.h analogtv.h pacman.h pacman_ai.h pacman_level.h \
-                 asm6502.h delaunay.h
+                 asm6502.h delaunay.h recanim.h
 MEN            = anemone.man apollonian.man attraction.man \
                  blaster.man blitspin.man bouboule.man braid.man bsod.man \
                  bumps.man ccurve.man compass.man coral.man \
@@ -234,7 +240,7 @@ MEN         = anemone.man apollonian.man attraction.man \
                  anemotaxis.man memscroller.man substrate.man \
                  intermomentary.man fireworkx.man fiberlamp.man boxfit.man \
                  interaggregate.man celtic.man cwaves.man abstractile.man \
-                 lcdscrub.man hexadrop.man tessellimage.man
+                 lcdscrub.man hexadrop.man tessellimage.man binaryring.man
 
 RETIRED_MEN    = ant.man bubbles.man critical.man flag.man forest.man \
                  laser.man lightning.man lisa.man lissie.man lmorph.man \
@@ -516,6 +522,8 @@ $(UTILS_BIN)/spline.o:              $(UTILS_SRC)/spline.c
 $(UTILS_BIN)/usleep.o:         $(UTILS_SRC)/usleep.c
 $(UTILS_BIN)/visual.o:         $(UTILS_SRC)/visual.c
 $(UTILS_BIN)/xmu.o:            $(UTILS_SRC)/xmu.c
+$(UTILS_BIN)/xft.o:            $(UTILS_SRC)/xft.c
+$(UTILS_BIN)/utf8wc.o:         $(UTILS_SRC)/utf8wc.c
 $(UTILS_BIN)/logo.o:           $(UTILS_SRC)/logo.c
 $(UTILS_BIN)/minixpm.o:                $(UTILS_SRC)/minixpm.c
 $(UTILS_BIN)/yarandom.o:       $(UTILS_SRC)/yarandom.c
@@ -561,6 +569,9 @@ xscreensaver-sgigl: xscreensaver-sgigl.c
        $(CC) $(LDFLAGS) -o $@ $< -I$(UTILS_SRC) $(HACK_PRE) \
                $(XMU_LIBS) -lX11 -lXext $(X_EXTRA_LIBS) -lm
 
+test-utf8wc: $(UTILS_SRC)/utf8wc.c
+       $(CC) $(INCLUDES) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS) $(LDFLAGS)\
+       -o $@ -DSELFTEST $<
 
 # The rules for those hacks which follow the `screenhack.c' API.
 # If make wasn't such an utter abomination, these could all be combined
@@ -571,6 +582,9 @@ xscreensaver-sgigl: xscreensaver-sgigl.c
 attraction:    attraction.o    $(HACK_OBJS) $(COL) $(SPL)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(SPL) $(HACK_LIBS)
 
+binaryring:  binaryring.o $(HACK_OBJS) $(COL)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
 blitspin:      blitspin.o      $(HACK_OBJS) $(GRAB) $(XPM)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(XPM) $(XPM_LIBS)
 
@@ -671,7 +685,7 @@ truchet:     truchet.o      $(HACK_OBJS) $(COL)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(HACK_LIBS)
 
 bsod:          bsod.o          $(HACK_OBJS) $(GRAB) $(APPLE2) $(XPM)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(APPLE2) $(XPM) $(XPM_LIBS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(APPLE2) $(XPM) $(XPM_LIBS) $(THRL)
 
 apple2:                apple2.o apple2-main.o  $(HACK_OBJS) $(ATV) $(GRAB) $(TEXT)
        $(CC_HACK) -o $@ $@.o   apple2-main.o $(HACK_OBJS) $(ATV) $(GRAB) $(TEXT) $(XPM_LIBS) $(TEXT_LIBS) $(THRL)
@@ -1080,6 +1094,7 @@ apple2-main.o: $(UTILS_SRC)/resources.h
 apple2-main.o: $(UTILS_SRC)/textclient.h
 apple2-main.o: $(UTILS_SRC)/thread_util.h
 apple2-main.o: $(UTILS_SRC)/usleep.h
+apple2-main.o: $(UTILS_SRC)/utf8wc.h
 apple2-main.o: $(UTILS_SRC)/visual.h
 apple2-main.o: $(UTILS_SRC)/xshm.h
 apple2-main.o: $(UTILS_SRC)/yarandom.h
@@ -1124,6 +1139,17 @@ barcode.o: $(UTILS_SRC)/resources.h
 barcode.o: $(UTILS_SRC)/usleep.h
 barcode.o: $(UTILS_SRC)/visual.h
 barcode.o: $(UTILS_SRC)/yarandom.h
+binaryring.o: ../config.h
+binaryring.o: $(srcdir)/fps.h
+binaryring.o: $(srcdir)/screenhackI.h
+binaryring.o: $(srcdir)/screenhack.h
+binaryring.o: $(UTILS_SRC)/colors.h
+binaryring.o: $(UTILS_SRC)/grabscreen.h
+binaryring.o: $(UTILS_SRC)/hsv.h
+binaryring.o: $(UTILS_SRC)/resources.h
+binaryring.o: $(UTILS_SRC)/usleep.h
+binaryring.o: $(UTILS_SRC)/visual.h
+binaryring.o: $(UTILS_SRC)/yarandom.h
 blaster.o: ../config.h
 blaster.o: $(srcdir)/fps.h
 blaster.o: $(srcdir)/screenhackI.h
@@ -1612,7 +1638,9 @@ fontglide.o: $(UTILS_SRC)/hsv.h
 fontglide.o: $(UTILS_SRC)/resources.h
 fontglide.o: $(UTILS_SRC)/textclient.h
 fontglide.o: $(UTILS_SRC)/usleep.h
+fontglide.o: $(UTILS_SRC)/utf8wc.h
 fontglide.o: $(UTILS_SRC)/visual.h
+fontglide.o: $(UTILS_SRC)/xft.h
 fontglide.o: $(UTILS_SRC)/yarandom.h
 forest.o: ../config.h
 forest.o: $(srcdir)/fps.h
@@ -2102,6 +2130,7 @@ noseguy.o: $(UTILS_SRC)/resources.h
 noseguy.o: $(UTILS_SRC)/textclient.h
 noseguy.o: $(UTILS_SRC)/usleep.h
 noseguy.o: $(UTILS_SRC)/visual.h
+noseguy.o: $(UTILS_SRC)/xft.h
 noseguy.o: $(UTILS_SRC)/yarandom.h
 noseguy.o: $(srcdir)/xpm-pixmap.h
 pacman_ai.o: ../config.h
@@ -2245,6 +2274,7 @@ phosphor.o: $(UTILS_SRC)/hsv.h
 phosphor.o: $(UTILS_SRC)/resources.h
 phosphor.o: $(UTILS_SRC)/textclient.h
 phosphor.o: $(UTILS_SRC)/usleep.h
+phosphor.o: $(UTILS_SRC)/utf8wc.h
 phosphor.o: $(UTILS_SRC)/visual.h
 phosphor.o: $(UTILS_SRC)/yarandom.h
 piecewise.o: ../config.h
@@ -2332,6 +2362,17 @@ rd-bomb.o: $(UTILS_SRC)/resources.h
 rd-bomb.o: $(UTILS_SRC)/usleep.h
 rd-bomb.o: $(UTILS_SRC)/visual.h
 rd-bomb.o: $(UTILS_SRC)/yarandom.h
+recanim.o: ../config.h
+recanim.o: $(srcdir)/fps.h
+recanim.o: $(srcdir)/recanim.h
+recanim.o: $(srcdir)/screenhackI.h
+recanim.o: $(UTILS_SRC)/colors.h
+recanim.o: $(UTILS_SRC)/grabscreen.h
+recanim.o: $(UTILS_SRC)/hsv.h
+recanim.o: $(UTILS_SRC)/resources.h
+recanim.o: $(UTILS_SRC)/usleep.h
+recanim.o: $(UTILS_SRC)/visual.h
+recanim.o: $(UTILS_SRC)/yarandom.h
 ripples.o: ../config.h
 ripples.o: $(srcdir)/fps.h
 ripples.o: $(srcdir)/screenhackI.h
@@ -2392,6 +2433,7 @@ rotzoomer.o: $(UTILS_SRC)/visual.h
 rotzoomer.o: $(UTILS_SRC)/yarandom.h
 screenhack.o: ../config.h
 screenhack.o: $(srcdir)/fps.h
+screenhack.o: $(srcdir)/recanim.h
 screenhack.o: $(srcdir)/screenhackI.h
 screenhack.o: $(UTILS_SRC)/colors.h
 screenhack.o: $(UTILS_SRC)/grabscreen.h
index 4e80d7b7b5774a24213aaa9533cf9f7e3ca9f99a..f1abbb60d20ad4cd588be049026cf205f1510e35 100644 (file)
@@ -90,7 +90,8 @@ struct state {
     /* draw, erase, fill, init, line, object, z indexes */
   unsigned int di, ei, fi, ii, bi, li, eli, oi, zi;
   /* size variables */
-  unsigned int gridx, gridy, gridn;                     /* grid size */
+  int gridx, gridy;                     /* grid size */
+  unsigned int gridn;
   int lwid, bwid, swid;/* line width, background width, shadow width */
   int narray, max_wxh;
   int elwid, elpu, egridx, egridy; /* for now */
@@ -205,6 +206,7 @@ _init_zlist(struct state *st)
 
   st->gridx=st->xgwa.width/st->lwid;
   st->gridy=st->xgwa.height/st->lwid;
+  if ((st->gridx <= 0) || (st->gridy <= 0)) abort();
   st->gridn=st->gridx*st->gridy;
   /* clear grid */
   for (z=0; z<st->gridn; z++) {
index 7c2993e56c5ab92ad41e63b4e210d05905e90f25..20acc0d278eaac35af90e71b1cbaa6153f6389f5 100644 (file)
@@ -65,6 +65,7 @@
 # include <X11/Xlib.h>
 # include <X11/Xutil.h>
 #endif
+#include <limits.h>
 
 #include <assert.h>
 #include <errno.h>
@@ -941,11 +942,13 @@ analogtv_setup_frame(analogtv *it)
   }
   if (it->hashnoise_rpm > 0.0) {
     int hni;
+    double hni_double;
     int hnc=it->hashnoise_counter; /* in 24.8 format */
 
     /* Convert rpm of a 16-pole motor into dots in 24.8 format */
-    hni = (int)(ANALOGTV_V * ANALOGTV_H * 256.0 /
-                (it->hashnoise_rpm * 16.0 / 60.0 / 60.0));
+    hni_double = ANALOGTV_V * ANALOGTV_H * 256.0 /
+                (it->hashnoise_rpm * 16.0 / 60.0 / 60.0);
+    hni = (hni_double <= INT_MAX) ? (int)hni_double : INT_MAX;
 
     while (hnc < (ANALOGTV_V * ANALOGTV_H)<<8) {
       y=(hnc>>8)/ANALOGTV_H;
@@ -954,7 +957,12 @@ analogtv_setup_frame(analogtv *it)
       if (x>0 && x<ANALOGTV_H - ANALOGTV_HASHNOISE_LEN) {
         it->hashnoise_times[y]=x;
       }
-      hnc += hni + (int)(random()%65536)-32768;
+      /* hnc += hni + (int)(random()%65536)-32768; */
+      {
+        hnc += (int)(random()%65536)-32768;
+        if ((hnc >= 0) && (INT_MAX - hnc < hni)) break;
+        hnc += hni;
+      }
     }
 /*    hnc -= (ANALOGTV_V * ANALOGTV_H)<<8;*/
   }
@@ -1195,14 +1203,17 @@ static void analogtv_init_signal(const analogtv *it, double noiselevel, unsigned
   float *pe=it->rx_signal + end;
   float *p=ps;
   unsigned int fastrnd=rnd_seek(FASTRND_A, FASTRND_C, it->random0, start);
+  unsigned int fastrnd_offset;
   float nm1,nm2;
   float noisemul = sqrt(noiselevel*150)/(float)0x7fffffff;
 
-  nm1 = ((int)fastrnd-(int)0x7fffffff) * noisemul;
+  fastrnd_offset = fastrnd - 0x7fffffff;
+  nm1 = (fastrnd_offset <= INT_MAX ? (int)fastrnd_offset : -1 - (int)(UINT_MAX - fastrnd_offset)) * noisemul;
   while (p != pe) {
     nm2=nm1;
     fastrnd = (fastrnd*FASTRND_A+FASTRND_C) & 0xffffffffu;
-    nm1 = ((int)fastrnd-(int)0x7fffffff) * noisemul;
+    fastrnd_offset = fastrnd - 0x7fffffff;
+    nm1 = (fastrnd_offset <= INT_MAX ? (int)fastrnd_offset : -1 - (int)(UINT_MAX - fastrnd_offset)) * noisemul;
     *p++ = nm1*nm2;
   }
 }
@@ -1243,7 +1254,8 @@ static void analogtv_add_signal(const analogtv *it, const analogtv_reception *re
     */
 
     float sig0=(float)s[0];
-    float noise = ((int)fastrnd-(int)0x7fffffff) * (50.0f/(float)0x7fffffff);
+    unsigned int fastrnd_offset = fastrnd - 0x7fffffff;
+    float noise = (fastrnd_offset <= INT_MAX ? (int)fastrnd_offset : -1 - (int)(UINT_MAX - fastrnd_offset)) * (50.0f/(float)0x7fffffff);
     fastrnd = (fastrnd*FASTRND_A+FASTRND_C) & 0xffffffffu;
 
     p[0] += sig0 * level * (1.0f - noise_ampl) + noise * noise_ampl;
index 7691e151faefe9cbc0796da46c13aab805e1de00..e808e9f2f5279b3d38f877ecbb7c8b280d3e1836 100644 (file)
@@ -27,6 +27,7 @@
 #include "screenhack.h"
 #include "apple2.h"
 #include "textclient.h"
+#include "utf8wc.h"
 
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
@@ -800,6 +801,7 @@ struct terminal_controller_data {
   int curparam;
   int cursor_x, cursor_y;
   int saved_x,  saved_y;
+  int unicruds; char unicrud[7];
   union {
     struct {
       unsigned int bold : 1;
@@ -901,6 +903,8 @@ a2_vt100_printc (apple2_sim_t *sim, struct terminal_controller_data *state,
   int i;
   int start, end;
 
+  /* Mostly duplicated in phosphor.c */
+
   switch (state->escstate)
     {
     case 0:
@@ -964,6 +968,38 @@ a2_vt100_printc (apple2_sim_t *sim, struct terminal_controller_data *state,
           state->curparam = 0;
           break;
         default:
+
+          /* states 102-106 are for UTF-8 decoding */
+
+          if ((c & 0xE0) == 0xC0) {        /* 110xxxxx - 11 bits, 2 bytes */
+            state->unicruds = 1;
+            state->unicrud[0] = c;
+            state->escstate = 102;
+            break;
+          } else if ((c & 0xF0) == 0xE0) { /* 1110xxxx - 16 bits, 3 bytes */
+            state->unicruds = 1;
+            state->unicrud[0] = c;
+            state->escstate = 103;
+            break;
+          } else if ((c & 0xF8) == 0xF0) { /* 11110xxx - 21 bits, 4 bytes */
+            state->unicruds = 1;
+            state->unicrud[0] = c;
+            state->escstate = 104;
+            break;
+          } else if ((c & 0xFC) == 0xF8) { /* 111110xx - 26 bits, 5 bytes */
+            state->unicruds = 1;
+            state->unicrud[0] = c;
+            state->escstate = 105;
+            break;
+          } else if ((c & 0xFE) == 0xFC) { /* 1111110x - 31 bits, 6 bytes */
+            state->unicruds = 1;
+            state->unicrud[0] = c;
+            state->escstate = 106;
+            break;
+          }
+
+        PRINT:
+
           /* If the cursor is in column 39 and we print a character, then
              that character shows up in column 39, and the cursor is no longer
              visible on the screen (it's in "column 40".)  If another character
@@ -1038,9 +1074,13 @@ a2_vt100_printc (apple2_sim_t *sim, struct terminal_controller_data *state,
           state->curparam = 0;
           break;
         case '%': /* Select charset */
-          /* No, I don't support UTF-8, since the apple2 font
-             isn't even Unicode anyway. We must still catch the
-             last byte, though. */
+          /* @: Select default (ISO 646 / ISO 8859-1)
+             G: Select UTF-8
+             8: Select UTF-8 (obsolete)
+
+             We can just ignore this and always process UTF-8, I think?
+             We must still catch the last byte, though.
+           */
         case '(':
         case ')':
           /* I don't support different fonts either - see above
@@ -1250,6 +1290,39 @@ a2_vt100_printc (apple2_sim_t *sim, struct terminal_controller_data *state,
     case 3:
       state->escstate = 0;
       break;
+
+    case 102:
+    case 103:
+    case 104:
+    case 105:
+    case 106:
+      {
+        int total = state->escstate - 100;  /* see what I did there */
+        if (state->unicruds < total) {
+          /* Buffer more bytes of the UTF-8 sequence */
+          state->unicrud[state->unicruds++] = c;
+        }
+
+        if (state->unicruds >= total) {
+          /* Done! Convert it to ASCII and print that. */
+          char *s;
+          state->unicrud[state->unicruds] = 0;
+          s = utf8_to_latin1 ((const char *) state->unicrud, True);
+          state->unicruds = 0;
+          state->escstate = 0;
+          if (s) {
+            c = s[0];
+            free (s);
+            goto PRINT;
+          } else {
+            c = 0;
+          }
+        }
+      }
+      break;
+
+    default:
+      abort();
     }
   a2_goto(st, state->cursor_y, state->cursor_x);
 }
@@ -1299,24 +1372,36 @@ terminal_controller(apple2_sim_t *sim, int *stepno, double *next_actiontime)
     if (! mine->fast_p)
       *next_actiontime += 4.0;
     *stepno = 10;
+
+    mine->last_emit_time = sim->curtime;
     break;
 
   case 10:
+  case 11:
     {
+      Bool first_line_p = (*stepno == 10);
       unsigned char buf[1024];
       int nr,nwant;
       double elapsed;
 
       elapsed=sim->curtime - mine->last_emit_time;
-      mine->last_emit_time=sim->curtime;
-      nwant=elapsed*25.0;
-      if (elapsed>1.0) nwant=1;
-      if (nwant<1) nwant=1;
-      if (nwant>4) nwant=4;
+
+      nwant = elapsed * 25.0;   /* characters per second */
+
+      if (first_line_p) {
+        *stepno = 11;
+        nwant = 1;
+      }
+
+      if (nwant > 40) nwant = 40;
 
       if (mine->fast_p)
         nwant = sizeof(buf)-1;
 
+      if (nwant <= 0) break;
+
+      mine->last_emit_time = sim->curtime;
+
       nr=terminal_read(mine, buf, nwant);
       for (i=0; i<nr; i++) {
         c=buf[i];
diff --git a/hacks/binaryring.c b/hacks/binaryring.c
new file mode 100644 (file)
index 0000000..2432073
--- /dev/null
@@ -0,0 +1,587 @@
+/*
+ * Binary Ring
+ * Copyright (c) 2006-2014 Emilio Del Tessandoro <emilio.deltessa@gmail.com>
+ *
+ *  Directly ported code from complexification.net Binary Ring art
+ *  http://www.complexification.net/gallery/machines/binaryRing/appletm/BinaryRing_m.pde
+ *
+ *  Binary Ring code:
+ *  j.tarbell   June, 2004
+ *  Albuquerque, New Mexico
+ *  complexification.net
+ *
+ * Directly based the hacks of: 
+ * 
+ * xscreensaver, Copyright (c) 1997, 1998, 2002 Jamie Zawinski <jwz@jwz.org>
+ *
+ * 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 "screenhack.h"
+#include "colors.h"
+#include "hsv.h"
+
+#define ANTIALIAS   1
+#define BLACK       0
+#define WHITE       1
+
+#define swap(a, b)  do { __typeof__(a) tmp;  tmp = a; a = b; b = tmp; } while(0)
+#define frand1()    ((((int) random() ) << 1) * 4.65661287524579692411E-10)
+#define min(a,b) ((a)<(b)?(a):(b))
+#define max(a,b) ((a)>(b)?(a):(b))
+
+/* better if signed */
+typedef uint32_t pixel_t;
+
+
+typedef struct {
+    float x, y;
+    float xx, yy;
+    float vx, vy;
+    float color;
+    int age;            /* age from 0 to ageMax */
+} particle_t;
+
+
+struct state {
+    int epoch;
+    int growth_delay;
+    int ring_radius;
+    int max_age;
+    float curliness;
+    int particles_number;
+    particle_t* particles;
+
+
+    Display *display;               /* variables for the X stuff */
+    Window window;
+    GC gc;
+    XGCValues gcv;
+    Visual* visual;
+    int depth;
+
+    int width;
+    int height;
+
+    Pixmap pix;                                /* for reshape */
+    XImage* buf;                           /* buffer */
+    pixel_t* buffer;
+    pixel_t colors[2];
+
+    Bool color;
+};
+
+
+
+static void point2rgb(int depth, pixel_t c, int *r, int *g, int *b) 
+{
+    switch(depth) {
+    case 32:
+    case 24:
+#ifdef HAVE_COCOA
+        /* This program idiotically does not go through a color map, so
+               we have to hardcode in knowledge of how jwxyz.a packs pixels!
+               Fix it to go through st->colors[st->ncolors] instead!
+             */
+        *r = (c & 0x00ff0000) >> 16;
+        *g = (c & 0x0000ffff) >>  8;
+        *b = (c & 0x000000ff);
+#else
+        *g = (c & 0xff00) >> 8;
+        *r = (c & 0xff0000) >> 16;
+        *b = c & 0xff;
+#endif
+        break;
+    case 16:
+        *g = ((c >> 5) & 0x3f) << 2;
+        *r = ((c >> 11) & 0x1f) << 3;
+        *b = (c & 0x1f) << 3;
+        break;
+    case 15:
+        *g = ((c >> 5) & 0x1f) << 3;
+        *r = ((c >> 10) & 0x1f) << 3;
+        *b = (c & 0x1f) << 3;
+        break;
+    }
+}
+
+static pixel_t rgb2point(int depth, int r, int g, int b) 
+{
+    pixel_t ret = 0;
+
+    switch(depth) {
+    case 32:
+    case 24:
+#ifdef HAVE_COCOA
+        /* This program idiotically does not go through a color map, so
+               we have to hardcode in knowledge of how jwxyz.a packs pixels!
+               Fix it to go through st->colors[st->ncolors] instead!
+             */
+        ret = 0xFF000000 | (r << 16) | (g << 8) | b;
+#else
+        ret |= (r << 16) | (g << 8) | b;
+#endif
+        break;
+    case 16:
+        ret = ((r>>3) << 11) | ((g>>2)<<5) | (b>>3);
+        break;
+    case 15:
+        ret = ((r>>3) << 10) | ((g>>3)<<5) | (b>>3);
+        break;
+    }
+
+    return ret;
+}
+
+void print_color ( struct state* st, pixel_t color );
+/* alpha blended point drawing -- this is Not Right and will likely fail on 
+ * non-intel platforms as it is now, needs fixing
+ */
+
+static
+void draw_point ( struct state* st,
+                 int x, int y, pixel_t myc, float a ) {
+
+    int or = 0, og = 0, ob = 0;
+    int r = 0, g = 0, b = 0;
+    int nr, ng, nb;
+    register pixel_t c;
+
+    /*or = st->buffer[ 3 * ( y * st->width + x ) + 0 ];
+    og = st->buffer[ 3 * ( y * st->width + x ) + 1 ];
+    ob = st->buffer[ 3 * ( y * st->width + x ) + 2 ];*/
+    
+    c = st->buffer[ y * st->width + x ];
+    point2rgb( st->depth, c, &or, &og, &ob );
+    point2rgb( st->depth, myc, &r, &g, &b );
+
+    nr = or + (r - or) * a;
+    ng = og + (g - og) * a;
+    nb = ob + (b - ob) * a;
+
+    /*st->buffer[ 3 * ( y * st->width + x ) + 0 ] = nr;
+    st->buffer[ 3 * ( y * st->width + x ) + 1 ] = ng;
+    st->buffer[ 3 * ( y * st->width + x ) + 2 ] = nb;*/
+    c = rgb2point(st->depth, nr, ng, nb);
+    st->buffer[ y * st->width + x ] = c;
+
+    XPutPixel( st->buf, x, y, c );
+}
+
+
+
+
+void print_color ( struct state* st, pixel_t color ) {
+    int r, g, b;
+    point2rgb(st->depth, color, &r, &g, &b);
+    printf( "%d %d %d\n", r, g, b);
+}
+
+
+
+#if ANTIALIAS
+#define plot_(X,Y,D) do{    \
+    _dla_plot(st, (X), (Y), color, (D) * alpha); }while(0)
+
+static
+void _dla_plot(struct state* st, int x, int y, pixel_t col, float br)
+{
+    if ( ( x >= 0 && x < st->width ) && ( y >= 0 && y < st->height ) ) {
+        if ( br > 1.0f ) br = 1.0f;
+        draw_point( st, x, y, col, br );
+    }
+}
+
+#define ipart_(X) ((int)(X))
+#define round_(X) ((int)(((float)(X))+0.5))
+#define fpart_(X) (((float)(X))-(float)ipart_(X))
+#define rfpart_(X) (1.0-fpart_(X))
+
+static
+void draw_line_antialias(
+        struct state* st,
+        int x1, int y1,
+        int x2, int y2,
+        pixel_t color, float alpha )
+{
+    float dx = (float)x2 - (float)x1;
+    float dy = (float)y2 - (float)y1;
+    float gradient;
+    float xend;
+    float yend;
+    float xgap;
+    float ygap;
+    int xpxl1;
+    int ypxl1;
+    float intery;
+    float interx;
+    int xpxl2;
+    int ypxl2;
+    int x;
+    int y;
+
+    /* hard clipping, because this routine has some problems with negative coordinates */
+    /* TODO: fix the alpha for that boundary cases. Using fabs() could solve? */
+    if ( ( x1 < 0 || x1 > st->width ) ||
+         ( x2 < 0 || x2 > st->width ) ||
+         ( y1 < 0 || y1 > st->height ) ||
+         ( y2 < 0 || y2 > st->height ) )
+        return;
+
+    if ( fabs(dx) > fabs(dy) ) {
+        if ( x2 < x1 ) {
+            swap(x1, x2);
+            swap(y1, y2);
+        }
+        gradient = dy / dx;
+        xend = round_(x1);
+        yend = y1 + gradient*(xend - x1);
+        xgap = rfpart_(x1 + 0.5);
+        xpxl1 = xend;
+        ypxl1 = ipart_(yend);
+        plot_(xpxl1, ypxl1, rfpart_(yend)*xgap);
+        plot_(xpxl1, ypxl1+1, fpart_(yend)*xgap);
+        intery = yend + gradient;
+
+        xend = round_(x2);
+        yend = y2 + gradient*(xend - x2);
+        xgap = fpart_(x2+0.5);
+        xpxl2 = xend;
+        ypxl2 = ipart_(yend);
+        plot_(xpxl2, ypxl2, rfpart_(yend) * xgap);
+        plot_(xpxl2, ypxl2 + 1, fpart_(yend) * xgap);
+
+        /*if ( rfpart_(yend) * xgap < 0 || fpart_(yend) * xgap < 0)
+        printf("%f %f\n", rfpart_(yend) * xgap, fpart_(yend) * xgap);*/
+        for(x=xpxl1+1; x <= (xpxl2-1); x++) {
+            plot_(x, ipart_(intery), rfpart_(intery));
+            plot_(x, ipart_(intery) + 1, fpart_(intery));
+            /*if ( rfpart_(intery) < 0 || fpart_(intery) < 0)
+            printf("%f %f\n", rfpart_(intery), fpart_(intery));*/
+            intery += gradient;
+        }
+    } else {
+        if ( y2 < y1 ) {
+            swap(x1, x2);
+            swap(y1, y2);
+        }
+        gradient = dx / dy;
+        yend = round_(y1);
+        xend = x1 + gradient*(yend - y1);
+        ygap = rfpart_(y1 + 0.5);
+        ypxl1 = yend;
+        xpxl1 = ipart_(xend);
+        plot_(xpxl1, ypxl1, rfpart_(xend)*ygap);
+        plot_(xpxl1, ypxl1+1, fpart_(xend)*ygap);
+        interx = xend + gradient;
+
+        yend = round_(y2);
+        xend = x2 + gradient*(yend - y2);
+        ygap = fpart_(y2+0.5);
+        ypxl2 = yend;
+        xpxl2 = ipart_(xend);
+        plot_(xpxl2, ypxl2, rfpart_(xend) * ygap);
+        plot_(xpxl2, ypxl2 + 1, fpart_(xend) * ygap);
+
+        for(y=ypxl1+1; y <= (ypxl2-1); y++) {
+            plot_(ipart_(interx), y, rfpart_(interx));
+            plot_(ipart_(interx) + 1, y, fpart_(interx));
+            interx += gradient;
+        }
+    }
+}
+#undef plot_
+#undef ipart_
+#undef fpart_
+#undef round_
+#undef rfpart_
+
+#else
+
+static
+void draw_line ( struct state* st, int x0, int y0, int x1, int y1, int color, float a ) {
+    register int steep;
+    register int deltax;
+    register int deltay;
+    register int error;
+    register int ystep;
+    register int y;
+    register int x;
+
+
+    steep = abs ( y1 - y0 ) > abs ( x1 - x0 );
+    if ( steep ) { swap(x0,y0); swap(x1,y1); }
+    if ( x0 > x1 ) { swap(x0,x1); swap(y0,y1); }
+    deltax = x1 - x0;
+    deltay = abs(y1-y0);
+    error = 0;
+    y = y0;
+    ystep = y0 < y1 ? 1 : -1;
+    if ( a > 1.0f ) a = 1.0f;
+
+    for ( x = x0; x < x1; x++ ) {
+        if ( steep ) {
+            if ( ( y >= 0 && y < st->width ) && ( x >= 0 && x < st->height ) )
+                draw_point( st, y, x, color, a );
+        } else {
+            if ( ( x >= 0 && x < st->width ) && ( y >= 0 && y < st->height ) )
+                draw_point( st, x, y, color, a );
+        }
+        error += deltay;
+        if ( ( error << 1 ) > deltax ) {
+            y += ystep;
+            error -= deltax;
+        }
+    }
+}
+#endif
+
+static void create_buffers ( struct state* st, Display* display, Screen* screen, Window window, GC gc ) {
+    
+    XWindowAttributes xgwa;
+    XGetWindowAttributes( display, window, &xgwa );
+
+    /* Initialize the pixmap */
+    if ( st->buf != NULL ) XFreePixmap( display, st->pix );
+    
+    XSetForeground( display, gc, st->colors[BLACK] );
+    st->pix = XCreatePixmap( display, window, st->width, st->height,
+                             xgwa.depth );
+    XFillRectangle( display, st->pix, gc, 0, 0, st->width, st->height);
+
+    /* Initialize the bitmap */
+    if ( st->buf != NULL ) XDestroyImage ( st->buf );
+    st->buf = XGetImage( display, st->pix, 0, 0, st->width, st->height, visual_depth(screen, st->visual), ZPixmap );
+    st->buffer = (pixel_t*) calloc(sizeof(pixel_t), st->width * st->height);
+    /*int i;
+    for ( i = 0; i < st->width * st->height; ++i ) st->buffer[i] = st->colors[BLACK];*/
+}
+
+static void init_particle ( particle_t* p, float dx, float dy, float direction, int color, int max_age ) {
+    float max_initial_velocity = 2.0f;
+    p->x = -dx;
+    p->y = -dy;
+    p->xx = 0;
+    p->yy = 0;
+    p->vx = max_initial_velocity * cos(direction);
+    p->vy = max_initial_velocity * sin(direction);
+
+    p->age = random() % max_age;
+
+    p->color = color;
+}
+
+static void clamp ( int* value, int l, int h ) {
+    if ( *value < l ) *value = l;
+    if ( *value > h ) *value = h;
+}
+
+static pixel_t next_color ( struct state* st, pixel_t current ) {
+    int r, g, b;
+
+    point2rgb(st->depth, current, &r, &g, &b);
+    r += random() % 5 - 2;
+    g += random() % 5 - 2;
+    b += random() % 5 - 2;
+    clamp(&r, 0, 255);
+    clamp(&g, 0, 255);
+    clamp(&b, 0, 255);
+
+    return rgb2point( st->depth, r, g, b );
+}
+
+
+static void create_particles ( struct state* st ) {
+    int i;
+    float emitx, emity;
+    float direction;
+
+    for ( i = 0; i < st->particles_number; i++ ) {
+        emitx = ( st->ring_radius * sinf( M_PI * 2 * ( (float) i / st->particles_number ) ) );
+        emity = ( st->ring_radius * cosf( M_PI * 2 * ( (float) i / st->particles_number ) ) );
+        direction = (M_PI * i) / st->particles_number;
+
+        if ( st->epoch == WHITE && st->color )
+            st->colors[WHITE] = next_color(st, st->colors[WHITE]);
+
+        init_particle(st->particles + i, emitx, emity, direction, st->colors[WHITE], st->max_age);
+    }
+}
+
+
+/* randomly move one particle and draw it */
+static void move ( particle_t* p, struct state * st ) {
+    int w = st->width / 2;
+    int h = st->height / 2;
+    float max_dv = 1.0f;
+
+    p->xx = p->x;
+    p->yy = p->y;
+    p->x += p->vx;
+    p->y += p->vy;
+    p->vx += frand1() * st->curliness * max_dv;
+    p->vy += frand1() * st->curliness * max_dv;
+
+
+#if ANTIALIAS
+    draw_line_antialias( st,
+        w+p->xx, h+p->yy, w+p->x, h+p->y, p->color, 0.15 );
+    draw_line_antialias( st,
+        w-p->xx, h+p->yy, w-p->x, h+p->y, p->color, 0.15 );
+#else
+    draw_line( st, w+p->xx, h+p->yy, w+p->x, h+p->y, p->color, 0.15 );
+    draw_line( st, w-p->xx, h+p->yy, w-p->x, h+p->y, p->color, 0.15 );
+#endif
+
+    p->age++;
+    /* if this is too old, die and reborn */
+    if ( p->age > st->max_age ) {
+        float dir = frand1() * 2 * M_PI;
+        p->x = st->ring_radius * sin(dir);
+        p->y = st->ring_radius * cos(dir);
+        p->xx = p->yy = p->vx = p->vy = 0;
+        p->age = 0;
+
+        if ( st->epoch == WHITE && st->color )
+            st->colors[WHITE] = next_color(st, st->colors[WHITE] );
+        
+        p->color = st->colors[st->epoch];
+    }
+}
+
+
+
+
+/* Initialize Everything */
+static void* binaryring_init ( Display* display, Window window ) {
+    XWindowAttributes xgwa;
+
+    struct state *st = ( struct state* ) calloc ( 1, sizeof( *st ) );
+
+    XGetWindowAttributes( display, window, &xgwa );
+
+    st->epoch = WHITE;
+    st->display = display;
+    st->window = window;
+    st->particles_number = (get_integer_resource(st->display, "particles_number", "Integer"));
+    st->growth_delay = (get_integer_resource(st->display, "growth_delay", "Integer"));
+    st->ring_radius = (get_integer_resource(st->display, "ring_radius", "Integer"));
+    st->max_age = (get_integer_resource(st->display, "max_age", "Integer"));
+    st->color =  get_boolean_resource(st->display, "color", "Boolean");
+    st->height = xgwa.height;
+    st->width = xgwa.width;
+    st->visual = xgwa.visual;
+    st->curliness = 0.5;
+
+
+    st->depth = visual_depth(xgwa.screen, st->visual);
+    st->colors[0] = rgb2point(st->depth, 0, 0, 0);
+    st->colors[1] = rgb2point(st->depth, 255, 255, 255);
+
+    /*describe_visual (stdout, xgwa.screen, xgwa.visual, False);*/
+
+    st->particles = malloc (st->particles_number * sizeof( particle_t ) );
+    create_particles ( st );
+
+    st->gc = XCreateGC( st->display, st->window, 0, &st->gcv );
+    create_buffers ( st, display, xgwa.screen, window, st->gc );
+
+
+    return st;
+}
+
+
+static unsigned long binaryring_draw ( Display* display, Window win, void *closure ) {
+    struct state *st = (struct state *) closure;
+    int i;
+
+    for ( i = 0; i < st->particles_number; i++ )
+        move( &(st->particles[i]), st );
+
+    /* draw the XImage in the Pixmap and the put the Pixmap on the screen */
+    XPutImage( display, st->pix, st->gc, st->buf, 0, 0, 0, 0, st->width, st->height);
+    XCopyArea( display, st->pix, win, st->gc, 0, 0, st->width, st->height, 0, 0 );
+
+    /* randomly switch ageColor periods */
+    if ( random() % 10000 > 9950 ) 
+        st->epoch = (st->epoch == WHITE) ? BLACK : WHITE;
+
+    return st->growth_delay;
+}
+
+
+
+static void binaryring_reshape ( Display* display, Window win, void *closure, unsigned int w, unsigned int h ) {
+    struct state *st = (struct state *) closure;
+
+    XWindowAttributes tmp;
+    XGetWindowAttributes(display, win, &tmp);
+
+    if ( tmp.height != st->height || tmp.width != st->width ) {
+        st->height = tmp.height;
+        st->width = tmp.width;
+
+
+        st->epoch = WHITE;
+        create_particles ( st );
+
+        create_buffers ( st, display, tmp.screen, win, st->gc );
+    }
+}
+
+
+/* if someone press a key switch the color */
+static Bool binaryring_event ( Display* display, Window win, void *closure, XEvent* event ) {
+    struct state *st = (struct state *) closure;
+
+    if ( (*event).xany.type == KeyPress ) {
+        st->epoch = (st->epoch == WHITE) ? BLACK : WHITE;
+    }
+
+    return False;
+}
+
+
+/* delete everything */
+static void binaryring_free ( Display* display, Window win, void *closure ) {
+    struct state *st = (struct state *) closure;
+    XWindowAttributes tmp;
+    XGetWindowAttributes(display, win, &tmp);
+
+    free( st->buffer );
+    free( st->particles );
+
+    free ( st );
+}
+
+
+/* Default resources of the program */
+static const char* binaryring_defaults [] = {
+    ".background:      black",
+    ".foreground:      white",
+    "*growth_delay:     10000",
+    "*particles_number: 5000",
+    "*ring_radius:      40",
+    "*max_age:          400",
+    "*color:            True",
+    "*ignoreRotation:   True",
+    0
+};
+
+static XrmOptionDescRec binaryring_options [] = {
+    { "-particles-number", ".particles_number", XrmoptionSepArg, 0 },
+    { "-growth-delay",     ".growth_delay",     XrmoptionSepArg, 0 },
+    { "-ring-radius",      ".ring_radius",      XrmoptionSepArg, 0 },
+    { "-max-age",          ".max_age",          XrmoptionSepArg, 0 },
+    { "-color",            ".color",            XrmoptionNoArg,  "True"  },
+    { "-no-color",         ".color",            XrmoptionNoArg,  "False" },
+    { 0, 0, 0, 0}
+};
+
+XSCREENSAVER_MODULE("BinaryRing", binaryring)
diff --git a/hacks/binaryring.man b/hacks/binaryring.man
new file mode 100644 (file)
index 0000000..2d44496
--- /dev/null
@@ -0,0 +1,88 @@
+.TH "Binary Ring" 1 "02-Sep-14" "X Version 11"
+.SH NAME
+binaryring - A system of path tracing particles evolves continuously from an initial creation. 
+.SH SYNOPSIS
+.B binaryring
+[\-fps]
+[\-install]
+[\-noinstall]
+[\-mono]
+[\-root]
+[\-visual \fIvisual\fP]
+[\-window] 
+[\-window\-id \fIwindow\-id\fP]
+[\-color]
+[\-no\-color]
+[\-growth\-delay \fIdelayms\fP]
+[\-particle\-number \fIparticles\fP]
+[\-ring\-radius \fIradius\fP]
+.SH DESCRIPTION
+A system of path tracing particles evolves continuously from an initial circular creation. 
+Ages of darkness play arbitrarily with ages of light.
+
+Ported (with some extensions) from the code by J. Tarbell at http://complexification.net
+.SH OPTIONS
+.I binaryring
+accepts the following options:
+.TP 8
+.B \-fps
+Display the current frame rate and CPU load.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-noinstall
+Don't install a private colormap for the window.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual
+class or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-window\-id \fIwindow\-id\fP
+Specify which window id to use.
+.TP 8
+.B \-color (Default)
+Particles have random generated colors that gradually change over time.
+.TP 8
+.B \-no\-color
+Use the original black and white visualization.
+.TP 8
+.B \-growth\-delay \fIdelayms\fP (Default: \fI10000\fP)
+Delay in ms between growth cycles. More delay, slower (but less CPU intensive).
+.TP 8
+.B \-particles\-number \fIparticles\fP (Default: \fI5000\fP)
+The number of particles in the system. With more particles the fps
+can also be affected.
+.TP 8
+.B \-ring\-radius \fIradius\fP (Default: \fI40\fP)
+The radius of the ring where the particles are born, in pixels.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global
+resources stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by J. Tarbell
+(complex@complexification.net, http://www.complexification.net).
+
+Ported to XScreensaver by Emilio Del Tessandoro (emilio.deltessa@gmail.com)
+.SH AUTHOR
+J. Tarbell <complex@complexification.net>, Jun-03
+
+Emilio Del Tessandoro <emilio.deltessa@gmail.com>, Aug-14
index d00a9e2aa9e8db2a7b204dcb769773da6d6caec0..b0feffead4d7a136b9d2a61dfe5f6a26de9df97a 100644 (file)
@@ -154,7 +154,7 @@ blitspin_draw (Display *dpy, Window window, void *closure)
         st->first_time = 0;
         st->loaded_p = True;
         st->qwad = -1;
-        st->start_time = time ((time_t) 0);
+        st->start_time = time ((time_t *) 0);
         blitspin_init_2 (st);
       }
 
@@ -165,7 +165,7 @@ blitspin_draw (Display *dpy, Window window, void *closure)
 
   if (!st->img_loader &&
       st->load_ext_p &&
-      st->start_time + st->duration < time ((time_t) 0)) {
+      st->start_time + st->duration < time ((time_t *) 0)) {
     /* Start a new image loading, but keep rotating the old image 
        until the new one arrives. */
     st->img_loader = load_image_async_simple (0, st->xgwa.screen, st->window,
@@ -254,7 +254,7 @@ blitspin_init (Display *d_arg, Window w_arg)
   if (st->delay2 < 0) st->delay2 = 0;
   if (st->duration < 1) st->duration = 1;
 
-  st->start_time = time ((time_t) 0);
+  st->start_time = time ((time_t *) 0);
 
   bitmap_name = get_string_resource (st->dpy, "bitmap", "Bitmap");
   if (! bitmap_name || !*bitmap_name)
index 49c47519aeadb0f99a705e1d476fab54a130f75a..20603986dde5cbef49b539120df7280fde0925b5 100644 (file)
@@ -433,7 +433,7 @@ static void InitBumpMap_2(Display *dpy, SBumps *pBumps)
     XWindowAttributes XWinAttribs;
     XGetWindowAttributes( pBumps->dpy, pBumps->Win, &XWinAttribs );
 
-    pBumps->start_time = time ((time_t) 0);
+    pBumps->start_time = time ((time_t *) 0);
 
        pScreenImage = XGetImage( pBumps->dpy, pBumps->source, 0, 0, 
                               pBumps->iWinWidth, pBumps->iWinHeight,
@@ -666,7 +666,7 @@ bumps_init (Display *dpy, Window Win)
     Bumps->duration = get_integer_resource (dpy, "duration", "Seconds");
     if (Bumps->delay < 0) Bumps->delay = 0;
     if (Bumps->duration < 1) Bumps->duration = 1;
-    Bumps->start_time = time ((time_t) 0);
+    Bumps->start_time = time ((time_t *) 0);
     return Bumps;
 }
 
@@ -684,7 +684,7 @@ bumps_draw (Display *dpy, Window window, void *closure)
     }
 
   if (!Bumps->img_loader &&
-      Bumps->start_time + Bumps->duration < time ((time_t) 0)) {
+      Bumps->start_time + Bumps->duration < time ((time_t *) 0)) {
     Bumps->img_loader = load_image_async_simple (0, Bumps->screen,
                                                  Bumps->Win, Bumps->source, 
                                                  0, 0);
index c7cb8e8401624d7fd0d9667907b68d1efecb5ae9..789a45e084d17db10eda6a33b9712c373f0c7498 100755 (executable)
@@ -19,7 +19,7 @@ use diagnostics;
 use strict;
 
 my $progname = $0; $progname =~ s@.*/@@g;
-my ($version) = ('$Revision: 1.9 $' =~ m/\s(\d[.\d]+)\s/s);
+my ($version) = ('$Revision: 1.12 $' =~ m/\s(\d[.\d]+)\s/s);
 
 my $verbose = 0;
 
@@ -74,7 +74,7 @@ sub parse_src($) {
 
   $body =~ s@/\*.*?\*/@@gs;
   $body =~ s@^#\s*(if|ifdef|ifndef|elif|else|endif).*$@@gm;
-  $body =~ s/(THREAD|ANALOGTV)_(DEFAULTS|OPTIONS)//gs;
+  $body =~ s/(THREAD|ANALOGTV)_(DEFAULTS|OPTIONS)(_XLOCK)?//gs;
 
   print STDERR "$progname: $file: defaults:\n" if ($verbose > 2);
   my %res_to_val;
@@ -194,6 +194,8 @@ sub parse_xml($$) {
   $body =~ s/</\001</gs;
   $body =~ s/\001(<option)/$1/gs;
 
+  my $video = undef;
+
   print STDERR "$progname: $file: options:\n" if ($verbose > 2);
   foreach (split (m/\001/, $body)) {
     next if (m/^\s*$/s);
@@ -209,6 +211,13 @@ sub parse_xml($$) {
       push @result, $val;
       print STDERR "$progname: $file:   name:    $name\n" if ($verbose > 2);
 
+    } elsif ($type eq 'video') {
+      error ("$file: multiple videos") if $video;
+      ($video) = ($args =~ m/\bhref="(.*?)"/);
+      error ("$file: unparsable video") unless $video;
+      error ("$file: unparsable video URL")
+        unless ($video =~ m@^https?://www\.youtube\.com/watch\?v=[^?&]+$@s);
+
     } elsif ($type eq 'number') {
       my ($arg) = ($args =~ m/\barg\s*=\s*\"([^\"]+)\"/);
       my ($val) = ($args =~ m/\bdefault\s*=\s*\"([^\"]+)\"/);
@@ -277,6 +286,9 @@ sub parse_xml($$) {
     }
   }
 
+#  error ("$file: no video") unless $video;
+  print STDERR "\n$file: WARNING: no video\n\n" unless $video;
+
   return @result;
 }
 
index 79910013a46d058a0a35d029971874ab9a5bdd2b..2c346bf19ca09161d57810325dacd3499693f9a3 100644 (file)
@@ -9,6 +9,7 @@ $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ASM6502.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ATTRACTION.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BARCODE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BINARYRING.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BLASTER.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BLITSPIN.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BOUBOULE.C
@@ -101,6 +102,7 @@ $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PYRO.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) QIX.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RD-BOMB.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RECANIM.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RIPPLES.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ROCKS.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RORSCHACH.C
index 79910013a46d058a0a35d029971874ab9a5bdd2b..2c346bf19ca09161d57810325dacd3499693f9a3 100644 (file)
@@ -9,6 +9,7 @@ $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ASM6502.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ATTRACTION.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BARCODE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BINARYRING.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BLASTER.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BLITSPIN.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BOUBOULE.C
@@ -101,6 +102,7 @@ $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PYRO.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) QIX.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RD-BOMB.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RECANIM.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RIPPLES.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ROCKS.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RORSCHACH.C
index 687a2fa1466c71e490f45f65d8c1091deb2c966e..d57f1af3c3c94a63e2ceedd1f2505eb705747f72 100644 (file)
@@ -4,8 +4,8 @@
             a screen saver and locker for the X window system
                             by Jamie Zawinski
 
-                              version 5.30
-                               10-Sep-2014
+                              version 5.31
+                               15-Nov-2014
 
                      http://www.jwz.org/xscreensaver/
 
@@ -203,6 +203,12 @@ The tags and parameters used here are:
         Where to position the "Check for Updates" options.
         This is used on MacOS and ignored on X11.
 
+-----------------------------------------------------------------------
+
+  <video href="URL" />
+
+        A link to a Youtube preview of this screen saver.
+
 -----------------------------------------------------------------------
 
   <hgroup>
index 2181862e304261588fb9b2d5646031e87d7b377c..0ff0c6c762cb0fdbda922053c42022357645c9a9 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=NgSetBY6VP4"/>
+
   <number id="speed" type="slider" arg="-speed %"
           _label="Speed" _low-label="Slow" _high-label="Fast"
           low="0" high="5" default="3"/>
index d2f97899c88d8d67168a07d811f439d18f85c7df..d420c166bfa08e970a42e7406e30be93fa5f9cb2 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=usITxM2YJZs"/>
+
 <!--
  -withdraw 1200
  -turnspeed 50
index 4bf8580e5809aeb275499058bb066cf347b4e184..34e2faaf396e4be514892a5227d014414a8ca195 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=hIqmIQbQkW8"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index 88a9ff7feb383718027bbe8aea8e89cdd47f754b..fc191e6febaa2365cc2c96988c34f455861bb1c2 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=PaG7RCO4ezs"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 1169eebc2adebc23d562967c65043ee014ba36de..9a6b9ed80fa12ec1067c6cb2259c43f166eee927 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=Ecw9dDc0db0"/>
+
   <number id="speed" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index 81eee354a55d2992abb338bfc08604f5f0b5fcac..aa4e05894808c542cc8b3d050cdbc3b71de05d5b 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=Bwa5-n6UUj8"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index 2af5957f3dd75805bb870866e6b3fbd4683f712d..7a9db2df37e25d2ffc3215a436ee9edaf5c93d1d 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=NYisFYtODTA"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index 25e622381c7a3dd0eb611418a2e71d96d5f73f4f..300c8cbd319d75769e8f29ac7d92e0cc0e27c1fc 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=aeWnjSROR8U"/>
+
   <boolean id="label" _label="Draw labels" arg-unset="-no-label"/>
 
   <boolean id="altgeom" _label="Include alternate geometries"
index 92fcaa03803c0a841074538adf4ae2e0aa67208e..692cd28833062497a0f1b942deb067fe07f593f8 100644 (file)
@@ -4,6 +4,8 @@
 
  <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=p3QZqhp67l8"/>
+
  <hgroup>
   <vgroup>
    <select id="mode">
@@ -58,6 +60,6 @@ you can use it as a terminal.
 
 http://en.wikipedia.org/wiki/Apple_II_series
 
-Written by Trevor Blackwell; 2003.
+Written by Trevor Blackwell and Jamie Zawinski; 2003.
   </_description>
 </screensaver>
index 3f6e18f8ba534da38335c9b4d841e6039259bc18..c114d77abb788cd2fddc0f3fde753ccf702c1efa 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=U78xPez5UGg"/>
+
   <number id="sharkspeed" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="25000"
index fc64c82e72f07ee979085d23dfabcc723c6d05f4..a528a46887361c5e6851e7f1f10229876b828f24 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=KAT9nkXCdms"/>
+
   <hgroup>
   <select id="mode">
     <option id="balls"    _label="Balls"/>
index dedf88c48b23e1a4c48811d2d1567a154a1a035f..a55d850215b1ce2f65d5273e004ffb0e816bb5a1 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=mpCRbi3jkuc"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index f15cffbbfbca0208e1a4b9eff4e33025cda16338..16f7b051935d3365879435eb330eceaac6a1c7dc 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=gmtAySJdsfg"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
@@ -28,6 +30,6 @@ The barcodes follow the UPC-A, UPC-E, EAN-8 or EAN-13 standards.
 http://en.wikipedia.org/wiki/Universal_Product_Code
 http://en.wikipedia.org/wiki/European_Article_Number
 
-Written by Dan Bornstein; 2003.
+Written by Dan Bornstein and Jamie Zawinski; 2003.
   </_description>
 </screensaver>
diff --git a/hacks/config/binaryring.xml b/hacks/config/binaryring.xml
new file mode 100644 (file)
index 0000000..1389173
--- /dev/null
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="binaryring" _label="BinaryRing">
+
+  <command arg="-root"/>
+
+  <video href="http://www.youtube.com/watch?v=KPiJb0Qm1SE"/>
+
+  <number id="growth-delay" type="slider" arg="-growth-delay %"
+          _label="Growth delay" _low-label="Low" _high-label="High"
+          low="0" high="100000" default="10000" />
+
+  <number id="ring-radius" type="slider" arg="-ring-radius %"
+          _label="Ring Radius"  _low-label="Short" _high-label="Long"
+          low="0" high="400" default="40" />
+
+  <number id="particles-number" type="slider" arg="-particles-number %"
+          _label="Number of particles" _low-label="Few" _high-label="Lots"
+          low="500" high="20000" default="5000" />
+
+  <boolean id="color" _label="Fade with colors" arg-unset="-no-color"/>
+
+  <xscreensaver-updater />
+
+  <_description>
+A system of path tracing particles evolves continuously from an
+initial creation, alternating dark and light colors.
+
+Written by J. Tarbell and Emilio Del Tessandoro; 2014.
+  </_description>
+</screensaver>
index 554ad6bef9bebcd373db58aac9446b8d8a7fac34..a3d96df4900b734cf87107019237447d20f23326 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=bp3J3si2Hr0"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index 6a91ea0e93b85225ee0a332b9b6e4cb58dff2bb8..dfaf3ae90fe4e58b70f49d30808f379d01edc43d 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=lgjbHMcSd8U"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="30000"
index 022515ff0c7a361f43f2b8e80e9829713289798c..81d484e647e98b606b59e067aa8a5017ef06c35a 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=UTtcwb-UWW8"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index f2b372e5f784b7189436aac148dfaf3e16bceb09..e290d631f2dd244f6de811fc3c28269e7990da15 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=L0JUBhpZlMw"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
            low="0" high="100000" default="40000"
index 0889baa4668f77b71ccbfd1362c60bb7a5fccca2..e74327476abdb4761065fc2bb4f53ccae742f5af 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=J3KAsV31d6M"/>
+
   <number id="size" type="slider" arg="-size %"
           _label="Size" _low-label="Tiny" _high-label="Huge"
           low="0.02" high="0.9" default="0.5"/>
index c6a9b6dd40507968d2d520579be7553d3756b549..2112f6375e3b3f334b639cc3cc3a5100ad5e2212 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=MdmIBmlkyFw"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index be8baa6ee557665b65b80a23401b630fc246409b..aa7fc4594548a62cdcaf6bad6ebe19a2002674ad 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=O_b5UWhv49w"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="30000"
index 2134821e3ef49f82def93c21280b0cd2c9376c6e..2a5299589aef614d444f1d338046822b64bb173e 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=CU4QFtZm9So"/>
+
   <hgroup>
    <vgroup>
 
index 55cae0d0b2cd76f3e08ae2de79b02a45b57c6582..cc4b5ec4672b3614fbf826f6040e1288ba7646a1 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=8GkcbBbcwBk"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 09c8cbf9209cfc4fd01eec052d520cf661d243d2..fe09fced46f3834c443bec39f143007bfc99abf3 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=PUhJq56ViGM"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="1000"
index 76fb69ff8226169d634c4e0dbeacbd02c754934f..775239c1ac44ec54168c41dcc01ab45b73906891 100644 (file)
@@ -4,6 +4,8 @@
 
  <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=YIqbMCfR3r0"/>
+
  <hgroup>
   <number id="delay" type="slider" arg="-delay %"
           _label="Duration" _low-label="5 seconds" _high-label="2 minutes"
index 8d100c19618f11633ca8d70f437c851a5cb23956..baee55dd7d18ca9ae2f620fa9b0fdd5f61fb2acd 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=4vcj8sq9FO8"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index b14df1e89c44bf9eb6ba6b81fe7903a016b23b4d..399006a47773e9238e60697fd9641f4438f0d4dd 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=Mli1TjZY1YA"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index 9ce7eb7190fcdef017c297917ddce3a6b1b1ea8b..e52c2d82c8e99a959a2ef4697876b7ae137c7d55 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=IV7D-NYRCiU"/>
+
   <!-- #### -degrees [360] -->
   <!-- #### -color [random] -->
   <!-- #### -colorcount [64] -->
index f54fcbff7777b5d7fe4c6b512fd0d3c283f9f964..5ed5912d7132d7b037de783a51750946e5b78d31 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=BxGHUFvI2Zo"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="25000"
index e2ca38816d88f93ae77de9caa54cf07b0b92ed4e..ded64e48c5e437759660d39850b0977626cbdaf9 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=IyqWkGVrFIY"/>
+
   <hgroup>
    <vgroup>
 
index 91938a88961e8687274392f219d16d72befc8915..e667452d39d98fb1ff8529507716466b9a778632 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=zqIlWzUHOz8"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Change image every" _low-label="0 seconds" _high-label="30 seconds"
           low="0" high="30" default="3"/>
index ffe6ea2801a09bbf32b6d1b9851feea73aa1a558..306e79913fbf291a8dea8a2b786a88b3ff1e41de 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=PnX60AAoTdw"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index 4ff87bcfd680076a729ee29fc73395ea3a04491c..f45122f5f41c2ee36ee592eb73bb26b19d25d988 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=tfqR1j1OQs8"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
diff --git a/hacks/config/cityflow.xml b/hacks/config/cityflow.xml
new file mode 100644 (file)
index 0000000..58c0efc
--- /dev/null
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="cityflow" _label="Cityflow" gl="yes">
+
+  <command arg="-root"/>
+
+  <video href="http://www.youtube.com/watch?v=LJMtu-9T3U0"/>
+
+  <hgroup>
+   <vgroup>
+    <number id="delay" type="slider" arg="-delay %"
+            _label="Frame rate" _low-label="Low" _high-label="High"
+            low="0" high="100000" default="20000"
+            convert="invert"/>
+
+    <number id="count" type="slider" arg="-count %"
+            _label="Boxes" _low-label="Few" _high-label="Many"
+            low="50" high="4000" default="800"/>
+
+    <number id="skew" type="slider" arg="-skew %"
+            _label="Skew"
+            _low-label="Low" _high-label="High"
+            low="0" high="45" default="12"/>
+   </vgroup>
+
+   <vgroup>
+    <number id="wave-speed" type="slider" arg="-wave-speed %"
+            _label="Wave speed" _low-label="Slow" _high-label="Fast"
+            low="5" high="150" default="25"/>
+
+    <number id="wave-radius" type="slider" arg="-wave-radius %"
+            _label="Wave overlap"
+            _low-label="Small" _high-label="Large"
+            low="5" high="512" default="256"/>
+
+    <number id="waves" type="slider" arg="-waves %"
+            _label="Wave complexity"
+            _low-label="Low" _high-label="High"
+            low="1" high="20" default="6"/>
+   </vgroup>
+  </hgroup>
+
+  <hgroup>
+   <boolean id="wire"    _label="Wireframe"   arg-set="-wireframe"/>
+   <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+   <xscreensaver-updater />
+  </hgroup>
+
+  <_description>
+Waves move across a sea of boxes. The city swells.  The walls are closing in.
+
+Written by Jamie Zawinski; 2014.
+  </_description>
+</screensaver>
index 57e89680dc441693641ed3f138297398b5b740af..bc5b971d40b275cd22bd61fb0a1b685716891917 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=TkVDO3nTTsE"/>
+
   <number id="delay" type="slider" arg="-cycle-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="25000"
index 585d7f9905d38d2bf59fc25590fa41de62503118..007449fdbe5c53b3db4fcf5f1d9c0950e418c68d 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=Q54NVuxhGso"/>
+
   <hgroup>
    <vgroup>
 
index 62f80cd92e427e4c9c4b7fdbaafe6c5f9399b653..6344e3ce6732d8149855fa63120261a5708b7283 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=IssDEcgB550"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index c5dacac593a04ed71319d7a595a7b97935bedbf1..2c0f5c28ad2eeca21855818ae1acc75720614277 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=3WTSvzJcQhw"/>
+
   <number id="delay2" type="slider" arg="-delay2 %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="1" high="500000" default="20000"
index f4acce542e9d291ea747ce2f862498deaf62fdc8..8f21543ec1b935fa93657dd1e0b2233d5cba9a01 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=ej1No4EK8Rc"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index a36138da3b326ee831ae283009c87b1c39dae511..dede344952985c6320591b6c20b7333863cac872 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=HN2ykbM2cTk"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index 17dc5c59839a7f0e19f4e1e514943213eba77eb7..11e875f6b86c14883c344fd8612da0b6b3d38b39 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=M27wWKGXIvw"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="60000"
index 1be63e26ee0e5b0da8a87ce18a91a3f5d71471b1..c170d9507b0f7b11196a7973b4b4a700522f3280 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=AFtxL6--lTQ"/>
+
   <hgroup>
    <vgroup>
 
index 278d1ead9b9f177837cc836bd235180852486e91..db466aa24839bbc55f6338a266d6c52cf6080f1d 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=aElbM0rZZNg"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 9c6cc7e1c8c22fe4d80ecfa2dfc9c09375f51035..a1d0ecab0a15b881d247fde527abfa6540790a79 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=enuZbkMiqCE"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="30000"
index 4223fbebdcfd73293cc3964c3cd9894f2f87fa10..67b2f099c24ff9d601dd0cf9c2f9127445533c56 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=nOTi7gy9l-I"/>
+
   <number id="delay" type="slider" arg="-delay %"
     _label="Frame rate" _low-label="Low" _high-label="High"
     low="0" high="100000" default="20000" convert="invert"/>
index ca633764a0434b8085d809dee94a3d59c082843a..9fd01cab034a77ded869615c26613928c18763cf 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=yOuJqiDUrpY"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index c71995535aca58f2a6b6c5a9f3c37d8e8536bbde..ebbb994a45cfc24f9e832abc4ed5086cccd8c5b0 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=If7FOc8UnYs"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="1000000" default="500000"
index c9cb3566552db37e7c8c7a768730d7a02c3fd1a1..4f385f4e49a86e5c226d9ee7ca8a05a079224ea9 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=QU0aPwWwHbg"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="30000"
index 32afbcc4c1bc5d2202b7ea5a647f97d12fdfcc9b..c0d98f6c7072f13a9863d286c45eedd6c9e3cf91 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=dFlyRTObuDo"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index 32914ab94838eea5449083268078e7f82f5224c3..2d63feb7f71fcd0bef4d01dd1d5824b59df13819 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=kfdDTv07Nhw"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Duration" _low-label="1 second" _high-label="1 minute"
           low="1" high="60" default="5"/>
index b1f1bf6c49a5afefea5cbd5aed81137f8e651f27..0ad477c85295f598225e8664782c30ffd2ea08b6 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=2CsKEVR3ecs"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="50000" default="10000"
index 0723cec73f150c0dbcf2474a3064ef6de1385bfd..17604fd8c051b39146c353783a89fd3bda3972b4 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=OhHI-pIHddA"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="50000"
index f12789816a749c2ab7055994be74fd5b2e38e97b..7cee8033f3e372efd768ab6bd288db7c528c8e65 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=l-yIY8vRlHA"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index a47b1a65e7a79a8d43ee212674248ddc9a7e0e42..c31e5ad6d692bdf6ba8aa97c0bc6ae520c1e8fb9 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=ENaG3gwtukM"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="200000" default="20000"
index 516652bbc5ef88e830c89abcf8e41fa022a22760..32e573815ecf97409875b84c3d49859e1d6e23d1 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=B7I5A7E3SP0"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame Rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="25000"
index ec75e8bfb2151dedcde5dd114c39bf66a11d46c8..21f21fe9cba1326fa4f3d078508972012c00c503 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=cppZgCh6U7I"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index 8aeac2006b3462889d98c726376b274c8261e58a..2edab165da24fa974acd98ef135e9480d6b36a63 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=QfglC_lvUTA"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
@@ -22,6 +24,6 @@ See also the "Queens" screen saver.
 
 http://en.wikipedia.org/wiki/Chess_endgame
 
-Written by Blair Tennessy; 2002.
+Written by Blair Tennessy and Jamie Zawinski; 2002.
   </_description>
 </screensaver>
index 152a0cfb88e5d6ccc79117358680d7dd8a288b47..b5bc7c629d6a0d329ab26ea7bc0ce034a06f93cb 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=8BL2o8QJmiA"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="30000"
@@ -37,6 +39,6 @@ Internal combusion engines.
 
 http://en.wikipedia.org/wiki/Internal_combustion_engine#Operation
 
-Written by Ben Buxton and Ed Beroset; 2001.
+Written by Ben Buxton, Ed Beroset and Jamie Zawinski; 2001.
   </_description>
 </screensaver>
index 94ce30d9176c8488ad70945ccb8f8f8f776eea01..35b8c723eed1e952da3f659666a6301fe70cbe05 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=rpk3zxQxaR8"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index d0c769a59f3943a3e07e4a26484a71791e8e4261..c87ca58834fcdfa6ed2ffe87dcbddef1a3fe9611 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=CQ6jDBnumT8"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 1b0bf5f3947ecf2c78b7ad48733771d0a4ed09f2..2957dc36c56857f3c2a2ca4d1ab7bf2d062bfa42 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=ZH1ZtfId0iA"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 5e007584933dece4b16d8d85501f42d5d6434a06..7260e3e3e73e8c64a2bbc2c1fecd3b2ab6bf3e8f 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=eKYmqL7ndGs"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index 30bb83f4c0d81343371d8f5a2113bb0e631dcb35..c8e7a018d263b8f7d35b818636ac971f25dd3e43 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=Cev034v37JM"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="30000"
index c74ea4cc28b88ba31206870599ee493604b5cb16..ed5c54ada6166e9bd504d87dbed859c69f48c64b 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=PvYKJ-vkxE0"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index 55af1fbe401037dcad685a283f2735092135d39a..8dc15150394c9c0ec828c7d352707a03657f387c 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=-l9BfvnFIPM"/>
+
   <number id="Delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index c2120cafc06a325e246644018c1f92dd8402de27..00f7eb527c86d1c2ddd0d68c4b522abf1be0f2c0 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=LuEC3EONzjc"/>
+
   <string id="text" _label="Text for flag" arg="-text %"/>
 
   <number id="delay" type="slider" arg="-delay %"
index 5fc5670e6d01cff7e05a0deac22f4ad885598bcc..1fa6dcf9000693be6981ad3d80c760310653006c 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=6Pu8JKNT_Jk"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="50000"
index 71bbfc581605e269c137f2966ec0169c4247562b..bf2e942623de878102c5981e1e7ba5f6388d2880 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=RzWRoAMFtnw"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 8b3cf62f28bf9015b577ec85a60a4c9dce0ee226..04d95fe5b5a3d0b6b4b84f928e27ebd432fc3d39 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=mu3iN_BSpt4"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index b2db35a9b8c15e9e9c05393c28a4b9341e604593..d9dcba2c47eb133919a3d104bc7a1c873d3946d0 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=vcB-6S7Hfuk"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 126068eb01a5a15cef50e71fb92ab94120fd86a0..165983a4a9093a4f0ed1e13d61e3dbdc0bcfbd02 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=RJjbRV0FC_A"/>
+
   <hgroup>
    <vgroup>
     <number id="speed" type="slider" arg="-delay %"
index e0e5e25c91d8392cdc4091ab1ce4636b477d2543..40333a99c5821bdd83bd9acc61b2e52c89a2366c 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=5Iz9V-vOrxA"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 499b5d4a34a3db3b8cd4e2aabe10d90f5e045fbe..e6776dc9a778a91e44eb5152d34948f2c559ef25 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=0beqUyN5ZsI"/>
+
   <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
 
   <select id="preset">
index 3d348dd6782cb0b2a12cd2c4c480539bd7763e5b..202ca7f7717aa8a65890b59bd1e6705a3b741524 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=mLGDvtbFvfg"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="30000"
index 653c1f7c48b65cd577c9d14fed30a664032ae604..809ea006d221faacc4dbf7541d20645fbf16b388 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=2KCXD19FHk0"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 08313995ad663f6434c22751b28d8efa4b9c3b73..b64d413388f4df6b1c88914273e86bf1e1f3f637 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=EEK2qbAmKWs"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="3000000" default="500000"
index 75c8d7398be2d9e158226e37499724a1a0e46c80..27f1606b6cc23e514d97e3ca51dee22293186b09 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=NrGe3xcqAns"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 7ce04c373e7946c91d835b1845019894062a2865..8fa3c44d024d390257dadc026fa573a66ab8b5e3 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=xBprAm9w-Fo"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index 53115a7bd83466b791b90519cca61646017b0421..310247f9199daf22af990384d4fc1d7fb1de89ad 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=OHamiC1tcdg"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="30000"
index 38d2807ed0a0086bf9fc45339ef2c3fd0c9e4b25..3327a779781b6f772540cfd12b4ec21bf996d667 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=qulzooBLIcU"/>
+
   <hgroup>
    <vgroup>
     <select id="object">
diff --git a/hacks/config/geodesicgears.xml b/hacks/config/geodesicgears.xml
new file mode 100644 (file)
index 0000000..62e7a91
--- /dev/null
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="geodesicgears" _label="GeodesicGears" gl="yes">
+
+  <command arg="-root"/>
+
+  <video href="http://www.youtube.com/watch?v=gd_nTnJQ4Ps"/>
+
+  <number id="delay" type="slider" arg="-delay %"
+          _label="Frame rate" _low-label="Low" _high-label="High"
+          low="0" high="100000" default="30000"
+          convert="invert"/>
+
+  <number id="timeout" type="slider" arg="-timeout %"
+          _label="Duration" _low-label="5 seconds" _high-label="2 minutes"
+          low="5" high="120" default="20"/>
+
+  <hgroup>
+   <boolean id="labels"  _label="Describe gears" arg-set="-labels"/>
+   <boolean id="numbers" _label="Number gears"   arg-set="-numbers"/>
+   <boolean id="wire"    _label="Wireframe"      arg-set="-wireframe"/>
+  </hgroup>
+
+  <hgroup>
+   <boolean id="wander"  _label="Wander"    arg-unset="-no-wander"/>
+   <boolean id="spin"    _label="Spin"      arg-unset="-no-spin"/>
+   <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+  </hgroup>
+
+  <xscreensaver-updater />
+
+  <_description>
+A set of meshed gears arranged on the surface of a sphere.
+
+http://en.wikipedia.org/wiki/Geodesic_dome
+http://en.wikipedia.org/wiki/Involute_gear
+
+Written by Jamie Zawinski; 2014.
+  </_description>
+</screensaver>
index c7c87f84d846e1ea5edcb375f911df1cc8fefb43..8e0d9ed1614ccca6be2618e537c22f11b5ea221f 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=vbRFlKH-LpA"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 8f6a74c2f6ef7a70d582c2818c32bba73e0735b2..a440df4d14d3bc8b3506827e6a14a1efb87b9bb0 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=wUWwQXRp8lE"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index de37ceab79a8ffcc86fbcf20cf2cc9d26ce110d8..f04c7c2f4b48fdba34745e4ba75875c24e1c2fad 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=94ac7nEQyBI"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 61ba1aa77330f4367e8ff342d79b2bcc9905243a..199d81dbb21b215a733fea5c925a2cb93e17e9dc 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=q6F-CDX6-tU"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index 7bb8a9df6f5620e6bcb4e4d1db94d46451241106..78a475adec089f32348f57a5d1c6f0433c923a00 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=_0Ff3qHUfsA"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index 4e05757d3d2c4ef82d95ade8808f176b8372a997..e63b49d9f8fcc39d64a1fe5da9711bac4d72bdaf 100644 (file)
@@ -4,6 +4,8 @@
 
  <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=1qRCviRmsTY"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 524654e29a57dc112f787a9ccf5783f525758e2f..3ae0bc67d5e0634a7a8bdd5a913178944a67b875 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=ILiYNkeEb_k"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index f36301fc6036f84d97820cc28cc0e2cb4756258d..0e0bb71f29842cc85eae1748481f817a505404a7 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=_dktSpsaCPg"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="30000"
index 71434a756ea09ddd9af33baf75fa13c9a5b28ff1..bc6f792509c87649800b4af8fdc8d856383f67b0 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=hXZquXPG4pg"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
@@ -22,7 +24,6 @@
   </hgroup>
 
   <hgroup>
-   <boolean id="light"   _label="Lighting"               arg-unset="-no-light"/>
    <boolean id="wire"    _label="Wireframe"              arg-set="-wireframe"/>
    <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
   </hgroup>
@@ -35,6 +36,6 @@ The Earth, bouncing around in space.
 If you would like it to display a different planet, the texture maps
 that come with "ssystem" work well.
 
-Written by David Konerding; 1998.
+Written by David Konerding and Jamie Zawinski; 1998.
   </_description>
 </screensaver>
index 161f10e2ba0bf6d4109bc9819de5b18272042859..6940c001baed0c9b2696433627e22a4a20c86110 100644 (file)
@@ -4,6 +4,8 @@
 
  <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=SuMIatcSPdU"/>
+
   <hgroup>
    <vgroup>
  <number id="delay" type="slider" arg="-delay %"
@@ -38,6 +40,6 @@ A school of fish, using the classic "Boids" algorithm by Craig Reynolds.
 
 http://en.wikipedia.org/wiki/Boids
 
-Written by David C. Lambert; 2006.
+Written by David C. Lambert and Jamie Zawinski; 2006.
  </_description>
 </screensaver>
index 1ef8bb0ca603891481fdf862e3f88d438d50c3de..ae0022cd50a3b68d05bb32f1f98424493b8fd2a1 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=Hi0xUWnqBhQ"/>
+
   <hgroup>
    <vgroup>
    <number id="delay" type="slider" arg="-delay %"
index 96be638d007df406a2fd014a8d42518e6448790c..dc72c9d5559f9e4c8f2af83f9e5e1063672348d2 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=AIqz-G0n1JU"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 5863453a1ab22e1baaf59649758dc532352f603f..d3a10a01d58d2d3c0060f428e5c5d608a8e5dab9 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=jrXa-QtY6MU"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index f1fbbb71c38a2190ed792ad41880feb6578cb2f6..8957cc82931f8f5bab677af79071eb3363b33615 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=bLMAF4Q-mGA"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index bf0465afde4fff442f98eaeb14ce75d437d8125d..2ae6efd207c9f387388e3e0858b647b677a4644b 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=spQRFDmDMeg"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index 469db9766ab84e06fdc624a5abef030c64d90e5c..f92033e2dcf12b0f85d7a34cd1e77c2a52e09ac6 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=lVEi089s1_c"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="250000" default="10000"
index 25ece7769cc497c995b37a3f0f2301c7f032e2c6..2c8c9d09a467554261c76dd24521961b8ae62b4b 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=K2lqgBPde4o"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 6f510975267b5b9f817d5365e6ea74d9d5867662..34ca643f9fe2114300a99e812daec1d57ca70116 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=K7LbfXh3LTc"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="200000" default="100000"
index 4846158a91fdea865ca86acfaf636d91507c9233..e1dfa0a846e71c8f155b9c8ed87276510c4d4a14 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=H-mMnadnPSs"/>
+
   <number id="delay" type="slider" arg="-subdelay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index 6b60bc2a8f6b4651c58d6a6d754fc6b68c75d52f..1b0a522a7c7d29bdc0722e4a43848c11b57eff8e 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=HMPVzQUGW-Q"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index f67cf95ac8e60fe182e63abbb52404d75337471d..59aa2b851fbe2dde5893c5779abeb6e4d31521a0 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=NhKmipo_Ek4"/>
+
   <hgroup>
    <vgroup>
 
index 9645ba7eab727ff8bc194b949ced57648d388e5b..7372b7de1db0233f199a1630560077b5e44b31ed 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=Ck0pKMflau0"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 70748612d6721f7a9b1f1f64c0ce01ae6208a0c0..5983314ec92b61998c56d1fe76b15fd51d1a3891 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=BqOHgn0BQOc"/>
+
   <hgroup>
     <vgroup>
      <number id="delay" type="slider" arg="-delay %"
index 41cd0ca9732d1855426f4e2e04a2d001b6a57136..1cfc0711aa8aaf3d22335b5cf4d2c6a5cc7b2951 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=tOLzz_D4-0E"/>
+
   <hgroup>
     <vgroup>
       <number id="delay" type="slider" arg="-delay %"
index a6218eab888a1844161e54ad6ca182b4371220f7..8703391cfc29a7a600f75ccf838ce1c290e995a7 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=KJWe4G4Qa1Q"/>
+
   <hgroup>
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
index 9ecfa5cf87f439f4c9975a7c5ff9bf119d94e5b0..7a24e76e6d5e1ca7facfbb5eae4eb400a677705f 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=QcJnc9EKJrI"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 488fd3bc21c5668b21936373d087941a7cccaa56..1b0ebf704e07d93f51daf4f4fd4f21daff397ef0 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=0uOIrVFsECM"/>
+
   <number id="delay" type="slider" arg="-delay %"
     _label="Frame rate" _low-label="Low" _high-label="High"
     low="0" high="100000" default="20000"
index b6b3ad8117bb5428051408d3e3e8b64a8595f3db..9809cc53ff5f075ef70578da88f69e8501b66a5c 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=FP8YJzFkdoQ"/>
+
   <number id="delay2" type="slider" arg="-delay2 %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index 43d4e933a2e00dac694677d9c86d08a361c7e1ef..a474e95a277c116e520d6a7b78454baee8c7ef5d 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=wqPOZiuj4RI"/>
+
   <number id="speed" type="slider" arg="-growth-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="18000" convert="invert"/>
index a6eb75edd8ef52a798d0bd503f75952773e39d2b..62537cb5e8c86176acc6f0168f21b1feea7082e5 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=nEmvx4l1sHI"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 195088b9b98f7ba6e6589e1226315c6565cc2e4a..26b5835526f528771fb44e91d68380b0089b175d 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=pH-ykepPopw"/>
+
   <number id="speed" type="slider" arg="-draw-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="30000" convert="invert"/>
index 9edce9968c0e6f77905b2d82edc7bb3340945bfd..97fe6dcafb6e35e49aa1b099e07540960309db5e 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=60vfs2WcDtE"/>
+
   <hgroup>
    <boolean id="random" _label="Randomize almost everything" arg-unset="-no-random"/>
 
index 4d23cdec98f0784514a548c6c489cf7abf5da695..60b36a1de188077c8b0b523b5f3efde0d3365008 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=T5_hiY2eEeo"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 260d64dc8facb9b6bb0d5ecf7f483d1075f3f20a..b7a702d6f48d25c7fe5068bd312411e789966fbd 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=E3Ae7uQtWP0"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 65f1974335481c96353a0cc19de9c9aa6cf4fb61..4eab9a08c7172b2915818b3f4053a205846879ef 100644 (file)
@@ -3,6 +3,8 @@
 <screensaver name="juggler3d" _label="Juggler3D" gl="yes">
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=TJkKaXBOvCA"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index ac927b91f41ab79284096d6898d001ad2c08bdaf..cd4c72403e442c4fda695cf275e0319f57de0cc5 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=cA4Rgq-rmy8"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index 6e60bf8d4c58d0555feda562b855123075b5664b..e5c58efbd454b00a0ab4871598a6452dcbaf5902 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=mGplFlx1y3M"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index 098d7e7e8027971e537eb00909e281347bec1324..7ec9931cef06652fdb2194a1b8112c92e241d848 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=SJqRaCCy_vo"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 95e71ef36e278af0b462ea5e1dde5eef4bbd9cde..ebf92e849569716e30c5bb30d85f89a317ff35b0 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=c2gvyGVNG80"/>
+
   <hgroup>
     <select id="kleinbottle">
       <option id="random"         _label="Random shape"/>
index ae4d04dd96e7e232d599ea75ba1043f917fc7f6b..e64e8f7a034408e07dd90a8b627ab849c70f2eed 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=64ULSfxhkDY"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index 752add1d0a08bc8ce014923c38139497040c6ef9..c93c941c51fa3f5ab7921ff9ac47d037d7b3635c 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=-TBqI4YKOKI"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index b1b11c4c861ba5db5d72486faf3e3c2869d81011..4ee42adc414dd5c5b7b2e8892a865379c393c699 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=QjPEa3KDlsw"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="40000"
index 1aef59b2e34e9c040ae8868c9ff5429bb710f89e..7e9f3003c8fb64af3d38897638b7246f685e2a9c 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=XKbtdHL35u0"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 6a00f5c25a322aeab22103213857841263581a3d..f255f11602b49f7bcff5f7045c000dcd6aafa0ef 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=aWtHHBOkO4w"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="5000000" default="100000"
index c5cb6a432d78fc56d88edf19859f86973bb819a6..f6f664b4d48bdc96df9b038cf06861156b1fbff5 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=lUUdHtPvp5Y"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index 82ab4daaafaedc50c4fd5f803cb97fae5de12c85..31a4f7ec96e9a22fef41f148a6f2ea5537b798e1 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=AUbAuARmlnE"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index fa8a9dec33123143b96549ce5f7ac92d503fcba4..cb8583a8ada5c169b6256c1837c687a6baaf881b 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=6EBNCXcD9f0"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 2893773f4e84e9862e6d2e6d5fa49f89a964136c..f33fa07f48c616bfd96e199666e7104647fb38f4 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=yMbMB7xQMkA"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index f326d0956af14ccdd235593431045eafe2ce64d9..1a44ddde610c13be1227cf5c3d26b9728dba677f 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root" />
 
+  <video href="https://www.youtube.com/watch?v=MGwySGVQZ2M"/>
+
     <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
@@ -55,7 +57,7 @@
 
   <xscreensaver-updater />
 
-  <_description> 
+  <_description>
 A translucent spinning, blinking thing.  Sort of a cross between the wards
 in an old combination lock and those old backlit information displays that
 animated and changed color via polarized light.
index ede1a90a84943a0ad0688fb6e7f3f2e8653bf902..c79250b998928a0289a2b326afb35bb5091e04b4 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=_kTMO7oEN8U"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="200000" default="100000"
index 095e91824e2e77bb1594640d9fdf99cda94a232f..c8010a61a1ff3d3505b5abcb0c8d43896285de22 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root" />
 
+  <video href="http://www.youtube.com/watch?v=KlDw0nYwUe4"/>
+
   <number id="displaytime" type="slider" arg="-displaytime %"
           _label="Display time for each program"
           _low-label="5 seconds" _high-label="2 minutes"
@@ -34,7 +36,7 @@
 
   <xscreensaver-updater />
 
-  <_description> 
+  <_description>
 Emulates a 6502 microprocessor, and runs some example programs on it.
 
 The family of 6502 chips were used throughout the 70's and 80's in
index 3cf4419b2ee51375082f40710e55d2cf749b6fa9..f04eadc0a74518dcb70d47eb3e8a1608124d97c4 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=-u4neMXIRA8"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-solve-delay %"
index 2087d2b06c9e86a6e138ea6b65cde5902c9afcc7..ec8dc84429b87fd3f7a07a8619e59b1e3ad08fdd 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=DQJRNlTKCdA"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index 416235763b311fa1c83d9c997eea626ae6457e8e..b4b452cee40b1e90e26e326e55726db750be23ed 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=qpnuNJH9cLw"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="30000"
index 71660e0d58921f5dbbcc33654797984ceda23d1f..1103d348082b3e7fbd8546676ef2fd4459d23789 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=wcdKHCp9foY"/>
+
  <!-- #### -color [random] -->
 
   <hgroup>
index 75fd920125a1c2c9a95e4ecce2691be67ae69024..dc6e7d2fadcf0f59645537d2b68093d4181e5a94 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=o4GTO18KHe8"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index ed17cb897d9ee6db58f3e3a0c35ea2b211d81c11..e4f44f0287b55531e99aedf3da0860d8116743bc 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=aXNIYpdh8Ug"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index 0672322c01c7c1ff1cd41a853b2c4b31f050d5f4..75e35303cb76b304daf7ac78a8b3cbce02eeffd5 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=77Nib6jQrXc"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index 233570d394bd8d8fc718603e08730565de763adf..262ed1741a1dc43df2ea50f962c8907538f01925 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=kpT6j2-9b40"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="30000"
index e94e54bdecc0d7d4bb484cb0ae38ce03239c0254..2ff94d982fbe69a91ebf40be3793231767a3c88a 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=S50zFVcUe4s"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Duration" _low-label="1 second" _high-label="1 minute"
           low="1" high="60" default="5"/>
index c2496fe6c566a90499819a44229f393d223ac114..5fd5ef57ec6ec6a6b23f638ce285f80d6313cf15 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=7iBNbYCo8so"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="50000"
index fb4073b7dda4b84e4149bd77c0f86ec63cd8727f..97c91f1251acb6d58e1fb3037c444279464a87fd 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=D1A0tNcPL4M"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index 829cd5448823cf9cce02aed804b3cff8d85dc2a4..6d48d8562f234187e3740b8a401576ef1870ac82 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=lNtDppjOli4"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="40000"
index 103c2b8782921cbfdc705181e6ce6a55c3350588..4a1835ea4a36da6c74bdd7445b38f385cd323fe1 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=knqnPcZGqkA"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index 0a21a552f106670b1996746d9b7bde1085a63125..1424aa89b7951781a7093db9f397958418d2bc2b 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=aXNIYpdh8Ug"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 1ee6ee63860052c0a68fa5d33cfe47c6f0132be5..8eb8a5dfa2942fc74f1f5c3c5277bb5674d6ace1 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=oUfgDnyGqHM"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index a8d8449c61348afb8663b1c8b166006102bf2535..be59c7374e1ecea792759953909a93e3488024aa 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=x5DQjgYqmn0"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index 533fc8e6d8fa98617ec384071179c2a9cbf39423..e3654f4703c033544a096d13e1b7b5a6ee8d2bcc 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=ONJlg9Y_TLI"/>
+
   <xscreensaver-text />
   <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
 
index f88cf09eff172c1edcdf1d92a34c972b02b339fb..976495c57e692cc92ede8477778ff78e6239e91f 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=G-pdjis0ECw"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
@@ -21,6 +23,6 @@ Simulates a game of Pac-Man on a randomly-created level.
 
 http://en.wikipedia.org/wiki/Pac-Man
 
-Written by Edwin de Jong; 2004.
+Written by Edwin de Jong and Jamie Zawinski; 2004.
   </_description>
 </screensaver>
index a0ad14cd8f321ab4ca8dfed74bc8ec85a8cdf26a..85f4ee9195071d73b681c90f614bba1d350fe964 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=VFibXcP1JH0"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Duration" _low-label="1 second" _high-label="1 minute"
           low="1" high="60" default="5"/>
index a78fd0ad587d7d6b945aab6409e2fa77ef118535..fef7cbf67da11dc279b3708cff6627613eb8dc65 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=iuutzMOVYgI"/>
+
   <number id="bgrowth" type="slider" arg="-bgrowth %"
           _label="Explosions" _low-label="Slow" _high-label="Fast"
           low="1" high="20" default="5"/>
index 62550b541b4087d7fa1acffdd458a4c820cec792..68b4844317ca3939332867f4629923e862613617 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=atlkrWkbYHk"/>
+
    <hgroup>
     <vgroup>
      <number id="delay" type="slider" arg="-delay %"
index 307c6b455be45e57fc5dce1fd876379f7c933f8c..dab2468a1f37b3a9fbbd015faf7a177eb1967f26 100644 (file)
@@ -4,6 +4,8 @@
 
  <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=QkJ9cN0QQd8"/>
+
  <hgroup>
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
index 1e9ae563ccae366d97535ca8a785b95ab95e6b65..f291d37d6bce56af68f97d8d830f42e9cb4147c3 100644 (file)
@@ -4,6 +4,8 @@
 
  <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=G6ZWTrl7pV0"/>
+
  <hgroup>
   <vgroup>
    <number id="delay" type="slider" arg="-delay %"
index 7939cbbd31f51f2c64ede9dca831e0de83d5f1df..afceb0004bfaf97899515102e3418db34b4da73b 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=snm7o95AR8E"/>
+
   <hgroup>
    <vgroup>
 
@@ -58,6 +60,6 @@ Loads several random images, and displays them as if lying in a random pile.
 The pile is periodically reshuffled, with new images coming in and old ones
 being thrown out.
 
-Written by Jens Kilian; 2008.
+Written by Jens Kilian and Jamie Zawinski; 2008.
   </_description>
 </screensaver>
index 72fcd90e2239c6913e36a7b3800711abf5290cf3..6b60fbdfe89a2892e955032477596fda0ab7eb4c 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=3gQr1FxFSe0"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index e62b544622f40210e8ea92f00b34a78968d9c2a4..5f7d7e26614aa622a688a72beca24898bb81f7d9 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=rHY8dR1urQk"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index b2e034acaa8e0d7ba1d066792d8b569e204a0a6a..22be2528fc2954da27cf216ca211bb488304fdde 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=UsUGENa7jvE"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
@@ -42,6 +44,6 @@
   <_description>
 A growing plumbing system, with bolts and valves.
 
-Written by Marcelo Vianna; 1997.
+Written by Marcelo Vianna and Jamie Zawinski; 1997.
   </_description>
 </screensaver>
index d2346bc6a172138e904107bd67fd0cfaf5bc2675..c33ac7fa4ade75def06d77c27823456227c3a75f 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=gYb-3EErLJE"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="30000"
index f9fd0fad7490e0b4d676a8f044b8c961d51aaf9a..fa09ce562c2dc9fe2739c3e3324b05a39113f5bc 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=6j2H2gL8cws"/>
+
   <boolean id="identical" _label="Identical pieces" arg-set="-identical"/>
 
   <number id="delay" type="slider" arg="-delay %"
index 19bdb43f004e2a9d99efcd6e65e99a04f0d3efd2..d7c38f2c0c266cb22d0308721ed14b7ca9026152 100644 (file)
@@ -4,6 +4,8 @@
 
  <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=MKZQ5Q7QINM"/>
+
  <hgroup>
   <vgroup>
    <select id="display-mode">
index 8cc66caf624d3af27a77bfb35b0ec0726c1850f8..8f344e64188b50242d4f6f18db6ed81bc8d6e9a4 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=2jPmisDwwi0"/>
+
   <hgroup>
    <vgroup>
     <number id="speed" type="slider" arg="-speed %"
@@ -40,6 +42,6 @@ In clock mode, the score keeps track of the current time.
 
 http://en.wikipedia.org/wiki/Pong
 
-Written by Jeremy English and Trevor Blackwell; 2003.
+Written by Jeremy English, Trevor Blackwell and Jamie Zawinski; 2003.
   </_description>
 </screensaver>
index f44387e776426943baa9cc2348bf98e6efad656b..ce036b1236964f309dcb95bddfa42ea94685c244 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=99Aweq7Nypc"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="25000"
index b6b3da416d65c0ac8c1e2d41d6d9f810204bcceb..ad51832e918c66d0bd63b8597f180c680094c09b 100644 (file)
@@ -4,17 +4,7 @@
 
   <command arg="-root"/>
 
-  <hgroup>
-    <select id="view-mode">
-      <option id="walk"      _label="Random motion"/>
-      <option id="walk"      _label="Walk"          arg-set="-view-mode walk"/>
-      <option id="turn"      _label="Turn"          arg-set="-view-mode turn"/>
-      <option id="walk-turn" _label="Walk and turn" arg-set="-view-mode walk-turn"/>
-    </select>
-
-    <boolean id="orientation-marks" _label="Show orientation marks"
-              arg-set="-orientation-marks"/>
-  </hgroup>
+  <video href="http://www.youtube.com/watch?v=Zg6ONPUTwUQ"/>
 
   <hgroup>
     <select id="display-mode">
 
   <hgroup>
     <vgroup>
+     <hgroup>
       <number id="speed-wx" type="slider" arg="-speed-wx %"
-              _label="WX rotation speed"
-              _low-label="-4.0" _high-label="4.0"
+              _label="WX speed"
+              _low-label="-4" _high-label="4"
               low="-4.0" high="4.0" default="1.1"/>
+     </hgroup>
 
+     <hgroup>
       <number id="speed-wy" type="slider" arg="-speed-wy %"
-              _label="WY rotation speed"
-              _low-label="-4.0" _high-label="4.0"
+              _label="WY speed"
+              _low-label="-4" _high-label="4"
               low="-4.0" high="4.0" default="1.3"/>
+     </hgroup>
 
+     <hgroup>
       <number id="speed-wz" type="slider" arg="-speed-wz %"
-              _label="WZ rotation speed"
-              _low-label="-4.0" _high-label="4.0"
+              _label="WZ speed"
+              _low-label="-4" _high-label="4"
               low="-4.0" high="4.0" default="1.5"/>
+     </hgroup>
     </vgroup>
 
     <vgroup>
+     <hgroup>
       <number id="speed-xy" type="slider" arg="-speed-xy %"
-              _label="XY rotation speed"
-              _low-label="-4.0" _high-label="4.0"
+              _label="XY speed"
+              _low-label="-4" _high-label="4"
               low="-4.0" high="4.0" default="1.7"/>
+     </hgroup>
 
+     <hgroup>
       <number id="speed-xz" type="slider" arg="-speed-xz %"
-              _label="XZ rotation speed"
-              _low-label="-4.0" _high-label="4.0"
+              _label="XZ speed"
+              _low-label="-4" _high-label="4"
               low="-4.0" high="4.0" default="1.9"/>
+     </hgroup>
 
+     <hgroup>
       <number id="speed-yz" type="slider" arg="-speed-yz %"
-              _label="YZ rotation speed"
-              _low-label="-4.0" _high-label="4.0"
+              _label="YZ speed"
+              _low-label="-4" _high-label="4"
               low="-4.0" high="4.0" default="2.1"/>
+     </hgroup>
     </vgroup>
 
     <vgroup>
+     <hgroup>
      <number id="walk-direction" type="slider" arg="-walk-direction %"
-             _label="Walking direction"
-             _low-label="-180.0" _high-label="180.0"
+             _label="Walk dir     "
+             _low-label="-180" _high-label="180"
              low="-180.0" high="180.0" default="83.0"/>
+     </hgroup>
 
+     <hgroup>
      <number id="walk-speed" type="slider" arg="-walk-speed %"
-             _label="Walking speed"
-             _low-label="1.0" _high-label="100.0"
+             _label="Walk speed"
+             _low-label="1" _high-label="100"
              low="1.0" high="100.0" default="20.0"/>
+     </hgroup>
 
+     <hgroup>
      <number id="delay" type="slider" arg="-delay %"
              _label="Frame rate" _low-label="Low" _high-label="High"
              low="0" high="100000" default="10000"
              convert="invert"/>
-
-     <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+     </hgroup>
     </vgroup>
   </hgroup>
 
-  <xscreensaver-updater />
+  <hgroup>
+    <select id="view-mode">
+      <option id="walk"      _label="Random motion"/>
+      <option id="walk"      _label="Walk"          arg-set="-view-mode walk"/>
+      <option id="turn"      _label="Turn"          arg-set="-view-mode turn"/>
+      <option id="walk-turn" _label="Walk and turn" arg-set="-view-mode walk-turn"/>
+    </select>
+
+    <boolean id="orientation-marks" _label="Show orientation marks"
+              arg-set="-orientation-marks"/>
+
+    <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
+
+    <xscreensaver-updater />
+  </hgroup>
+
+
 
   <_description>
 A 4D embedding of the real projective plane.
index 22ea2bfac9b156ec859992d2464d43cc26464b66..f387c44b5b906c1ab1249eae52aed5b945b0adea 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=bnwRPPMopWc"/>
+
   <number id="speed" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index ad181ba642552d12f7a838a823de450ccedd2b5d..7a21430923b71c79cbfbc172b04e192de988ea81 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=pR0lpvOAbUo"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index 351583b09d45d40cd0433d533594af24a4d14057..1a18855b0aa6783cf388794cf43d3b5259b0a266 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=JJqVfnMstuw"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Slow" _high-label="Fast"
           low="0" high="100000" default="10000"
index cbdfb600ab8f418423d3eb3d00f5df7ca58bee2f..e4764f8bb790ebcf7bb993be66e513d4db6832e1 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=GPqDtJ0vF8U"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 87c3ac8a56151502ef8e92b476272e376b1ecb4c..31644205f20805ae10909b21a98a4e4fe056c5be 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=JsGf65d5TfM"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index a9b91849a666a9dfa9d3b957e98313e4b6d9128b..ceb8ac90cfdb37a3c87d746a74888872f21befd6 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=Ssy0ldFDeAs"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
@@ -24,6 +26,6 @@ See also the "Endgame" screen saver.
 
 http://en.wikipedia.org/wiki/Eight_queens_puzzle
 
-Written by Blair Tennessy; 2002.
+Written by Blair Tennessy and Jamie Zawinski; 2002.
   </_description>
 </screensaver>
index da187ee6ce1471bceda3d87021d65b85de00cb2c..bfb153b0d3c063eb5ce6e313d55c7caa366ea37a 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=xiooDyrZSsY"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 8bc60dbf2f5531f271d8db7d3be0ae66b38b216e..48b80b1917969c59bb461708ae66dc297d91721e 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=w8YXAalnRzc"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 872df9ffcc787e77ec3fd66f442fe0a4dac6431f..767db6c3b5b5c0dcdff4305915ac4ee32cca0759 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=7x7PMI7LFK0"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="50000"
index 25bd2726468f0ac1d457460555707ca1fd78fd17..04342ca97d79535f929d9c25a60e583662962961 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=G1OLn4Mdk5Y"/>
+
   <number id="iterations" type="slider" arg="-iterations %"
           _label="Iterations" _low-label="Small" _high-label="Large"
           low="0" high="10000" default="4000"/>
index d4436f1a56efeb7ffc04e6fccbade1c6e7976cde..9583e0fa276519f681333a2581adce8f1566a88e 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=HWcEvT1keDA"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index 2bcae86ca2b40870dfbe168c9111d6fef59a1b44..18aa533e811500ea0e94fefacc09ed400503613a 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=JVKDhd8gc7c"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000" convert="invert"/>
index accb81b01d957858e1cd78bbb65d27fb321b8eaa..3c42eebe57426282a41441801bc8563e9fa5584f 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=AQdJgvyVkXU"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index 8b4e6b2a674e6dfd76bfdcfe3d4d4a9490e1b933..ffbe2d0a350cab8ffd6e28f780381320943ba3d8 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=B2sGaRLWz-A"/>
+
   <hgroup>
    <vgroup>
 
index 31a5f9f2022f5a45902dc31080f3ff2f699347f7..8de0c84658fba356168996a8be8a96824b788cf1 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=pcfqdvvPG8k"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="30000"
index c17bb5343d0fb93ae1c34f90c1a6a67224010414..d906796dd00362b1ae2622a487ea558635ffe524 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=gJtxnQ5_8Zk"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="20000" default="10000"
index da2d82e51e601e2d3df3c75c0d5bbf4e62f77fa8..71e62984ea6332d50c6e948829c6dfa30f2b7be6 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=m0zdPWuFhjA"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="1000000" default="400000"
index 419468650dbbf9d72a442a6d67f4729b35b84f24..82daa983efde2c1abf4b955b514574bc859d5c3a 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=TGQRLAhDLv0"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index 132cb317fff0d26e1f30d885bd2587e05540d115..bbbd1f0c2c55ba52e7aee121788cd5d148ca233a 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=iCjtXUSQv1A"/>
+
  <hgroup>
   <vgroup>
   <number id="count" type="slider" arg="-count %"
index b9b66864d340067254c134e43672e017f05f4137..ae9f238a4d7c98f4b2b12aa7cc0708dd8d29bb9a 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=uKNE4xCdlno"/>
+
   <hgroup>
    <vgroup>
    <number id="delay" type="slider" arg="-delay %"
index b680778a658edeb25d17a112198042776f62dd01..9be06dc93ef824edfbf7808ed1450e437821e460 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=BgzNvBm4MuE"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index c3b9db3ebfeb27fc967f14ab380a993fd5e43217..514739b94f9790871d73d56db3e5b6f70550647e 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=XEL8g3qbthE"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 0f2d9a4acba4721b11637875ff1ff3e49551e78f..0754a7094e07f574202875eb160c74cfad1b948a 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=awOnhCxRD_c"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index cb43fc0c5f824ee0c085f91242ecd2ad72750dcb..2f5666dbe00e37fb139196f42836c4dd97eaa028 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=FswhxIVXdt8"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index 7e36102d37beb1d707ae0f6cbcfef7e6784b87c3..09668b5e1edefc25de156181ca03378f7be0cb1f 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=KrNVwyWi0io"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 5864e9e922c2bb406a1c902bb891f5357b44b2d2..21bba9408c7e8f0c50b5e4638075b22778a534d6 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=8Ov2SxnO_Kg"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="50000"
index f80537cdb03ef5d5b2f376954f924b11ddd67f92..7fa8c0fea8689cc5e948ac226913e7143c89ac25 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=av29CVh2UeM"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index 1967e658314b5662266f0bcec6f31a0e54d1545a..495232491cc79d4d2c8c62f82c8295e7590bb231 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=fmHl17ppgc0"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="30000"
index 60c92361ba63037dd977ffc4828310bd1b01d283..6ff728eb9339b70d3376c0d887cd0f7f57703b5c 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=WPhqyM9Bb4o"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 997e78ce4c22d60270d6edc46b61e77d5e1a66d8..26172d0b38824707520e1b9d00bda564c70ea679 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=Y1ceRT30qr0"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
@@ -18,6 +20,6 @@ Escher's infinite staircase.
 
 http://en.wikipedia.org/wiki/Maurits_Cornelis_Escher
 
-Written by Marcelo Vianna; 1998.
+Written by Marcelo Vianna and Jamie Zawinski; 1998.
   </_description>
 </screensaver>
index 432f59ff5130ac24b0c9a21e265203b87169aea7..3e2a5e819de8e7d0b17a5307832d2339465c3ad5 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=atwc7IJHuLo"/>
+
   <select id="mode">
     <option id="random" _label="Random"/>
     <option id="zoom"   _label="Color gradients" arg-set="-mode zoom"/>
index 3a9d18aee09283e1c94724f62f3c4cd79ff2445b..a78248b23d112e1b79720c123f5e02c39d1f1018 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=UUjC-6e7y_U"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 7fbc41586121af7caa81615601fe695779a507c7..d52841c78f910b4d01dc4b53a66c322586eb9220 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=xvDK_wwnXWs"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index 9e858595fb8965d80133fd0c511fa7abbec033c1..1dc436b671d66036fb4c6639cfc51b92f664c46b 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=F1qna7UAxC0"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index 94f2ade854aa463ef32bb6ce1717ccd58569cc92..97158f8bf3fcd47ac48f353a355319c43dbde440 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=dCCVgBOVD0E"/>
+
   <hgroup>
    <vgroup>
     <number id="speed" type="slider" arg="-growth-delay %"
@@ -28,6 +30,8 @@
 
     <boolean id="wire" _label="Wireframe only" arg-set="-wireframe" />
 
+    <boolean id="seamless" _label="Seamless mode" arg-set="-seamless" />
+
     <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
    </vgroup>
   </hgroup>
index 0574fb72feb8b3a49ce143e77f72306a2949a51e..efb4811e9612d443398b438894ddd2b83a4bff82 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=Mjlc7iPA1N4"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="40000"
index 7ce732db60315773b5b490d4843f8de92e0ace5b..09a26e76a88452773bcab1c4cc3ba2bc3a5bcb09 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=Q412lxz3fTg"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index e099da20e84402b44d7e32c17704d6527cb695ad..a8cbed1617f0b0d6a593bb6707307810905502c5 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=o_VRQxPCB7w"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index 4bbd25bb666076f25756782c5f316ac4ed78fa09..3de15550340ab062e12be65b09efe98d6fff7694 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=5UohH7U2CAI"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index e7186bccc109d33deca48c5e94e94de682477409..14b18875ae4d37c8fa56590508c1b33b58fff2f1 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=JgJ-OsgCCJ4"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"/>
index b7a4face226e75871d3d4fa0e50f86c8fd00f36b..5093ece38fffe1f3cf1bd15775d91fdbf7f3750c 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=JNgybysnYU8"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 595fb43e0f1d8721bdac6513c5a829ad6b60ad10..0c940cca6ade765d23a7ba2eb1b32255c3fc23c2 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=rfGfPezVnac"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index 208e17a38bfe82675bd4afabc6852c9361ae987c..0f7e22df29794d798a2e0442b964e9613d458dd3 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=GZe5rk_7TnA"/>
+
   <number id="start" type="slider" arg="-start %"
           _label="Start sequence time" _low-label="0 sec" _high-label="30 sec"
           low="0.00" high="27.79" default="0.00"/>
index 93f95aa40d29d096d68ad6cfb56e4fbbce7fa5ce..590af18fee13c018c8a74ad9e5bd850e768a8fae 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=zj0FHFJgQJ8"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 3c9bb1e10b90c42b0b9c8b628bb218668f8690e9..2eaf7f797a14bec43b63b162a626fc2b2bb4e383 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=GXrzjY-Flro"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index aaee9905566299d336330b2dc29e4a30d9e93c5e..7edd7d8761fce113b530a4f10b207b1931cf356e 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=dIF4fodt-L8"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="30000"
index e1bccb3e1dec64e46b82a591483fe03377a729d8..e6f9a5fa7d2abb2175f3b5e8fef59522b7ccef57 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=hoJ23JSsUD8"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="1000000" default="400000"
index cbb00d0e9a428e223a6a241fa89fed8034d433e1..824f420ff3175c26830bcb1dd162f86c93ea8785 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=7pxDMSduQoU"/>
+
   <hgroup>
    <vgroup>
 
index c94632e285e8158ac3f4deee75ee61040849518a..093efbf4ec49730f523d8fa660c7916581eafe11 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=vuWhUxBq99E"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 8b3dbadf398426bb50732f8aa01529709a4092c6..d144e9565e7573f1147703a7ab58e7aa1e1f8e5c 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=YSg9KY-qw5o"/>
+
   <number id="speed" type="slider" arg="-speed %"
           _label="Duration" _low-label="Short" _high-label="Long"
           low="0" high="1000" default="0" />
index 8c281bbeccbf89f192305678cb127be78976a8e3..e1fade1d972cde57091145bd8392f3b7ef207cb9 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="https://www.youtube.com/watch?v=u8esWjcR4eI"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Duration" _low-label="2 seconds" _high-label="2 minutes"
           low="2" high="120" default="5"/>
index 2f30de81751d240382c9a1d2b79b61291422c9ea..e34ce3b71fe4d032f53f4d7c9bd0b4d53ea8a8e6 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=IaVfFCIAUn8"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="250000" default="200000"
index caf63a20a5acadc7d06626a6d7a2c9abf69646db..4d63e3d9a2ba1476d7a93286712274ae08d87354 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=hD_8cBvknUM"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index a73a46a4b26c3ecd373b958ff8ceacc7493a081c..c6961cb40006f11f9b0beb3c6abe02e2b81b6795 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=2ZZC46Z9wJE"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index e773cad2a46c6b3f6bbee7851934038621a6c359..d645290638328d9dd2bd23b5f4bf238522e86900 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=u8esWjcR4eI"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index fdf26f76cff08bf4ec40dc28da286a0f018b53e8..823e372f47d64fd0d3c9f9a3257edbe349c5aa66 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=eWrRhSYzimY"/>
+
   <number id="points" type="slider" arg="-points %"
           _label="Particles" _low-label="Few" _high-label="Many"
           low="10" high="1000" default="400"/>
index 16b22f4a0fac28028552aab52164d593f2b36bbe..e5c05b311b5ded962dd9663ed00b590031720b63 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=Y2JTY7bssPM"/>
+
   <hgroup>
    <number id="whirlies" type="spinbutton" arg="-whirlies %"
            _label="Whirlies" low="-1" high="50" default="-1"/>
index 3f3e60deac4b1d419f2b43a4dc1657b649dd4ca3..a642b5bcf18e1729627374a0a0dbf6e5e17f2b9d 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=RmpsDx9MuUM"/>
+
   <hgroup>
    <vgroup>
     <number id="delay" type="slider" arg="-delay %"
index 9f5985a2293604509bd12cf567e214ee9c607b53..a1ab72c20d261c5f69ce1b42bc421ef83859daf9 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=-S26J2Ja11g"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="17000"
index aa4697bc6ccfd73ca2653037db47adce08f76351..1314456bb77334df8ae4a13ba410eaf9177f788b 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=jGuJU8JKxlI"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index 7dd1e89d7fe321d626a02dd991af2562280d890a..66f2c204080400cb045cf82615757b75c693669b 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=VmM1KkFsry0"/>
+
   <xscreensaver-image />
 
   <boolean id="showfps" _label="Show frame rate" arg-set="-fps"/>
index 08d962fe9dab05001f26d339903e233c14a27742..8c3a3568aeabd70b06877a432a811fe6b95b8a63 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=jUJiULU4i0k"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index f3c4a7dc03f1b07783bcf7552f09518a4de86707..959ca57aff02cb6b9924c0edbcecb4f4f0310cda 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=wSOiSrEbxu4"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Speed" _low-label="Slow" _high-label="Fast"
           low="0" high="200000" default="50000"
index 5f675e3e25321c1901e7328d99447ac9448062b6..9d5d6700ee1e2468c34358041fefc6fc46984a7a 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=5MrEaXnhEPg"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index 2a2c72522281f58600bfaf4f68de8a024a38ab27..e4b359788ae1baabbd63b002003d6da4c6f6f89b 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=dSJQHm-YoWc"/>
+
   <hgroup>
    <select id="size">
      <option id="font1" _label="Small font"  arg-set="-small"/>
index b23d15bc734b8b0699de5193442e763337979c25..0f2efc446684a80debf86638f2bcbf4df8f219ab 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=e_E-k37b4Vc"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index cb83175d332a235c042daf8b79eef5b5d5ab20f4..fb39fe10995c8c9ea8ca23f315d008edb609631f 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=XWCeQqzNavY"/>
+
   <number id="delay" type="slider" arg="-subdelay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="20000"
index c615faeba66e79934a5e45a2816fd3497e3767cc..6593f66ddcfdcbc313ecf648dd5d653f96c403c5 100644 (file)
@@ -4,6 +4,8 @@
 
   <command arg="-root"/>
 
+  <video href="http://www.youtube.com/watch?v=LeQa9inGEKc"/>
+
   <number id="delay" type="slider" arg="-delay %"
           _label="Frame rate" _low-label="Low" _high-label="High"
           low="0" high="100000" default="10000"
index fe3d108d64b4c0520d7c87faff9f7960b22ea44e..e2ce9a0963d347c00ea0a7851d47b185599d8403 100644 (file)
@@ -140,7 +140,7 @@ decayscreen_init (Display *dpy, Window window)
     gcflags |= GCSubwindowMode;
   st->gc = XCreateGC (st->dpy, st->window, gcflags, &gcv);
 
-  st->start_time = time ((time_t) 0);
+  st->start_time = time ((time_t *) 0);
   decayscreen_load_image (st);
 
   return st;
@@ -177,7 +177,7 @@ decayscreen_draw (Display *dpy, Window window, void *closure)
                                                   0, 0, 0, 0, 0);
         if (! st->img_loader) {  /* just finished */
 
-          st->start_time = time ((time_t) 0);
+          st->start_time = time ((time_t *) 0);
           if (st->random_p)
             st->mode = random() % (FUZZ+1);
 
@@ -199,7 +199,7 @@ decayscreen_draw (Display *dpy, Window window, void *closure)
     }
 
     if (!st->img_loader &&
-        st->start_time + st->duration < time ((time_t) 0)) {
+        st->start_time + st->duration < time ((time_t *) 0)) {
       decayscreen_load_image (st);
     }
 
index a4c7843ccdf90bac457ed342fd605fac9523dea7..28593f06f3aa8793c56001ab6543f62fff09cd9d 100644 (file)
@@ -289,7 +289,7 @@ distort_init (Display *dpy, Window window)
 
     st->img_loader = load_image_async_simple (0, st->xgwa.screen, st->window,
                                               st->window, 0, 0);
-    st->start_time = time ((time_t) 0);
+    st->start_time = time ((time_t *) 0);
     return st;
 }
 
@@ -298,7 +298,7 @@ distort_finish_loading (struct state *st)
 {
     int i;
 
-    st->start_time = time ((time_t) 0);
+    st->start_time = time ((time_t *) 0);
 
        st->buffer_map = 0;
        st->orig_map = XGetImage(st->dpy, st->window, 0, 0, st->xgwa.width, st->xgwa.height,
@@ -771,7 +771,7 @@ distort_draw (Display *dpy, Window window, void *closure)
     }
 
   if (!st->img_loader &&
-      st->start_time + st->duration < time ((time_t) 0)) {
+      st->start_time + st->duration < time ((time_t *) 0)) {
     st->img_loader = load_image_async_simple (0, st->xgwa.screen, st->window,
                                               st->window, 0, 0);
     return st->delay;
index a641367f8c1ccb254cdf0868d083578c0407056a..9f13c87bafe93beac020afcec0876306688d88bc 100644 (file)
@@ -204,7 +204,7 @@ recurse (struct state *st, double x, double y, int l, Display *dpy, Window win)
             "I think this happens on HPUX.  I think it's non-IEEE
             to generate an exception instead of a silent NaN."
           */
-         if ((abs(x) > 1.0E5) || (abs(y) > 1.0E5))
+         if ((fabs(x) > 1.0E5) || (fabs(y) > 1.0E5))
            x = x / y;
 
          nx = st->f[0][0][i] * x + st->f[0][1][i] * y + st->f[0][2][i];
index 22a136b4529d11a5a8390f644810522928ef49dc..b9aa2e0c72e93eb189c744ef40a32c30876a9dbb 100644 (file)
 # include "config.h"
 #endif /* HAVE_CONFIG_H */
 
-#undef DEBUG
+
+/* If you turn on DEBUG, this program also masquerades as a tool for
+   debugging font metrics issues, which is probably only if interest
+   if you are doing active development on libjwxyz.a itself.
+ */
+/* #define DEBUG */
 
 #include <math.h>
 
@@ -31,6 +36,8 @@
 
 #include "screenhack.h"
 #include "textclient.h"
+#include "xft.h"
+#include "utf8wc.h"
 
 #ifdef HAVE_DOUBLE_BUFFER_EXTENSION
 #include "xdbe.h"
 
 typedef struct {
   char *text;
-  int x, y, width, height;
-  int ascent, lbearing, rbearing;
+
+  int x, y;            /* Position of origin of first character in word */
+
+                       /* These have the same meanings as in XCharStruct: */
+  int lbearing;                /* origin to leftmost pixel */
+  int rbearing;                /* origin to rightmost pixel */
+  int ascent;          /* origin to topmost pixel */
+  int descent;         /* origin to bottommost pixel */
+  int width;           /* origin to next word's origin */
 
   int nticks, tick;
   int start_x,  start_y;
@@ -50,16 +64,14 @@ typedef struct {
 
 typedef struct {
   int id;
-  XColor fg;
-  XColor bg;
   Bool dark_p;
   Bool move_chars_p;
   int width;
 
   char *font_name;
-  XFontStruct *font;
-
   GC fg_gc;
+  XftFont *xftfont;
+  XftColor xftcolor_fg, xftcolor_bg;
 
   int nwords;
   word **words;
@@ -160,11 +172,16 @@ pick_font_1 (state *s, sentence *se)
   int count = 0, count2 = 0;
   int i;
 
-  if (se->font)
+  if (se->xftfont)
     {
-      XFreeFont (s->dpy, se->font);
+      XftFontClose (s->dpy, se->xftfont);
+      XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap,
+                    &se->xftcolor_fg);
+      XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap,
+                    &se->xftcolor_bg);
+
       free (se->font_name);
-      se->font = 0;
+      se->xftfont = 0;
       se->font_name = 0;
     }
 
@@ -203,9 +220,12 @@ pick_font_1 (state *s, sentence *se)
   names2 = XListFontsWithInfo (s->dpy, names[i], 1000, &count2, &info);
   if (count2 <= 0)
     {
-      fprintf (stderr, "%s: pattern %s\n"
-                "     gave unusable %s\n\n",
-               progname, pattern, names[i]);
+# ifdef DEBUG
+      if (s->debug_p)
+        fprintf (stderr, "%s: pattern %s\n"
+                 "     gave unusable %s\n\n",
+                 progname, pattern, names[i]);
+# endif /* DEBUG */
       goto FAIL;
     }
 
@@ -321,30 +341,98 @@ pick_font_1 (state *s, sentence *se)
 
   if (! ok) return False;
 
-  se->font = XLoadQueryFont (s->dpy, pattern);
+  se->xftfont = XftFontOpenXlfd (s->dpy, screen_number (s->xgwa.screen),
+                                 pattern);
+
+  /* Sometimes we get fonts with screwed up metrics.  For example:
+     -b&h-lucida-medium-r-normal-sans-40-289-100-100-p-0-iso8859-1
+
+     When using XDrawString, XTextExtents and XTextExtents16, it is rendered
+     as a scaled-up bitmap font.  The character M has rbearing 70, ascent 68
+     and width 78, which is correct for the glyph as rendered.
+
+     But when using XftDrawStringUtf8 and XftTextExtentsUtf8, it is rendered
+     at the original, smaller, un-scaled size, with rbearing 26, ascent 25
+     and... width 77!
+
+     So it's taking the *size* from the unscaled font, the *advancement* from
+     the scaled-up version, and then *not* actually scaling it up.  Awesome.
+
+     So, after loading the font, measure the M, and if its advancement is more
+     than 20% larger than its rbearing, reject the font.
+
+     ------------------------------------------------------------------------
+
+     Some observations on this nonsense from Dave Odell:
+
+     1. -*-lucidatypewriter-bold-r-normal-*-*-480-*-*-*-*-iso8859-1 normally
+        resolves to /usr/share/fonts/X11/100dpi/lutBS24-ISO8859-1.pcf.gz.
+
+        -*-lucidatypewriter-* is from the 'xfonts-100dpi' package in
+        Debian/Ubuntu. It's usually (54.46% of systems), but not always,
+        installed whenever an X.org server (57.96% of systems) is.  It might
+        be a good idea for this and xfonts-75dpi to be recommended
+        dependencies of XScreenSaver in Debian, but that's neither here nor
+        there.  https://qa.debian.org/popcon.php?package=xorg
+        https://qa.debian.org/popcon.php?package=xfonts-100dpi
+
+     2. It normally resolves to the PCF font... but not always.
+
+        Fontconfig has /etc/fonts/conf.d/ (it's /opt/local/etc/fonts/conf.d/
+        with MacPorts) containing symlinks to configuration files. And both
+        Debian and Ubuntu normally has a 70-no-bitmaps.conf, installed as part
+        of the 'fontconfig-config' package. And the 70-no-bitmaps.conf
+        symlink... disables bitmap fonts.
+
+        Without bitmap fonts, I get DejaVu Sans.
+
+     3. There's another symlink of interest here:
+        /etc/fonts/conf.d/10-scale-bitmap-fonts.conf. This adds space to the
+        right of glyphs of bitmap fonts when the requested size of the font is
+        larger than the actual bitmap font. Ubuntu and MacPorts has this one.
+
+        This specifically is causing text to have excessive character spacing.
+
+        (jwz asks: WHY WOULD ANYONE EVER WANT THIS BEHAVIOR?)
+
+     4. Notice that I'm only talking about Debian and Ubuntu. Other distros
+        will probably have different symlinks in /etc/fonts/conf.d/. So yes,
+        this can be an issue on Linux as well as MacOS.
+   */
+  {
+    XGlyphInfo extents;
+    int rbearing, width;
+    float ratio;
+    float min = 0.8;
+
+    XftTextExtentsUtf8 (s->dpy, se->xftfont, (FcChar8 *) "M", 1, &extents);
+    rbearing = extents.width - extents.x;
+    width = extents.xOff;
+    ratio = rbearing / (float) width;
 
 # ifdef DEBUG
-  if (! se->font)
-    {
-      if (s->debug_p)
-        fprintf (stderr, "%s: unable to load font %s\n",
-                 progname, pattern);
-      return False;
-    }
+    if (s->debug_p)
+      fprintf (stderr, "%s: M ratio %.2f (%d %d): %s\n", progname,
+               ratio, rbearing, width, pattern);
+# endif
+
+    if (ratio < min && !s->font_override)
+      {
+# ifdef DEBUG
+        if (s->debug_p)
+          fprintf (stderr, "%s: skipping font with broken metrics: %s\n",
+                   progname, pattern);
+# endif
+        return False;
+      }
+  }
+
 
-  if (se->font->min_bounds.width == se->font->max_bounds.width &&
-      !s->font_override)
+# ifdef DEBUG
+  if (! se->xftfont)
     {
-      /* This is to weed out
-         "-urw-nimbus mono l-medium-o-normal--*-*-*-*-p-*-iso8859-1" and
-         "-urw-courier-medium-r-normal--*-*-*-*-p-*-iso8859-1".
-         We asked for only proportional fonts, but this fixed-width font
-         shows up anyway -- but it has goofy metrics (see below) so it
-         looks terrible anyway.
-       */
       if (s->debug_p)
-        fprintf (stderr,
-                 "%s: skipping bogus monospace non-charcell font: %s\n",
+        fprintf (stderr, "%s: unable to load font %s\n",
                  progname, pattern);
       return False;
     }
@@ -354,7 +442,6 @@ pick_font_1 (state *s, sentence *se)
 # endif /* DEBUG */
 
   se->font_name = strdup (pattern);
-  XSetFont (s->dpy, se->fg_gc, se->font->fid);
   return True;
 }
 
@@ -366,10 +453,11 @@ static void
 pick_font (state *s, sentence *se)
 {
   int i;
-  for (i = 0; i < 20; i++)
+  for (i = 0; i < 50; i++)
     if (pick_font_1 (s, se))
       return;
-  fprintf (stderr, "%s: too many font-loading failures: giving up!\n", progname);
+  fprintf (stderr, "%s: too many font-loading failures: giving up!\n",
+           progname);
   exit (1);
 }
 
@@ -463,58 +551,67 @@ get_word_text (state *s)
 }
 
 
+/* Returns a 1-bit pixmap of the same size as the drawable,
+   with a 0 wherever the drawable is black.
+ */
+static Pixmap
+make_mask (Screen *screen, Visual *visual, Drawable drawable)
+{
+  Display *dpy = DisplayOfScreen (screen);
+  unsigned long black = BlackPixelOfScreen (screen);
+  Window r;
+  int x, y;
+  unsigned int w, h, bw, d;
+  XImage *out, *in;
+  Pixmap mask;
+  GC gc;
+
+  XGetGeometry (dpy, drawable, &r, &x, &y, &w, &h, &bw, &d);
+  in = XGetImage (dpy, drawable, 0, 0, w, h, ~0L, ZPixmap);
+  out = XCreateImage (dpy, visual, 1, XYPixmap, 0, 0, w, h, 8, 0);
+  out->data = (char *) malloc (h * out->bytes_per_line);
+  for (y = 0; y < h; y++)
+    for (x = 0; x < w; x++)
+      XPutPixel (out, x, y, (black != XGetPixel (in, x, y)));
+  mask = XCreatePixmap (dpy, drawable, w, h, 1L);
+  gc = XCreateGC (dpy, mask, 0, 0);
+  XPutImage (dpy, mask, gc, out, 0, 0, 0, 0, w, h);
+  XFreeGC (dpy, gc);
+  free (in->data);
+  free (out->data);
+  in->data = out->data = 0;
+  XDestroyImage (in);
+  XDestroyImage (out);
+  return mask;
+}
+
+
 /* Gets some random text, and creates a "word" object from it.
  */
 static word *
 new_word (state *s, sentence *se, const char *txt, Bool alloc_p)
 {
   word *w;
-  XCharStruct overall;
-  int dir, ascent, descent;
+  XGlyphInfo extents;
   int bw = s->border_width;
-  int slack;
 
   if (!txt)
     return 0;
 
   w = (word *) calloc (1, sizeof(*w));
-  XTextExtents (se->font, txt, strlen(txt), &dir, &ascent, &descent, &overall);
-
-  /* Leave a little more slack. Not entirely clear on what's going on here,
-     but maybe it's fonts with goofy metrics. */
-  slack = (overall.ascent + overall.descent) * 0.25;
-  if (slack < bw*2) slack = bw*2;
-  overall.lbearing -= slack;
-  overall.rbearing += slack;
-  overall.ascent   += slack;
-  overall.descent  += slack;
-
-  w->width    = overall.rbearing - overall.lbearing;
-  w->height   = overall.ascent   + overall.descent;
-  w->ascent   = overall.ascent   + bw;
-  w->lbearing = overall.lbearing - bw;
-  w->rbearing = overall.width    + bw;
-
-# if 0
-  /* The metrics on some fonts are strange -- e.g.,
-     "-urw-nimbus mono l-medium-o-normal--*-*-*-*-p-*-iso8859-1" and
-     "-urw-courier-medium-r-normal--*-*-*-*-p-*-iso8859-1" both have
-     an rbearing so wide that it looks like there are two spaces after
-     each letter.  If this character says it has an rbearing that is to
-     the right of its ink, ignore that.
-
-     #### Of course, this hack only helps when we're in `move_chars_p' mode
-          and drawing a char at a time -- when we draw the whole word at once,
-          XDrawString believes the bogus metrics and spaces the font out
-          crazily anyway.
-
-     Sigh, this causes some text to mis-render in, e.g.,
-     "-adobe-utopia-medium-i-normal--114-*-100-100-p-*-iso8859-1"
-     (in "ux", we need the rbearing on "r" or we get too much overlap.)
-   */
-  if (w->rbearing > w->width)
-    w->rbearing = w->width;
-# endif /* 0 */
+  XftTextExtentsUtf8 (s->dpy, se->xftfont, (FcChar8 *) txt, strlen(txt),
+                      &extents);
+
+  w->lbearing = -extents.x;
+  w->rbearing = extents.width - extents.x;
+  w->ascent   = extents.y;
+  w->descent  = extents.height - extents.y;
+  w->width    = extents.xOff;
+
+  w->lbearing -= bw;
+  w->rbearing += bw;
+  w->descent  += bw;
+  w->ascent   += bw;
 
   if (s->mode == SCROLL && !alloc_p) abort();
 
@@ -522,118 +619,84 @@ new_word (state *s, sentence *se, const char *txt, Bool alloc_p)
     {
       int i, j;
       XGCValues gcv;
-      GC gc0, gc1;
+      GC gc_fg, gc_bg, gc_black;
+      XftDraw *xftdraw;
+      int width  = w->rbearing - w->lbearing;
+      int height = w->ascent + w->descent;
+
+      if (width <= 0)  width  = 1;
+      if (height <= 0) height = 1;
+
+      w->pixmap = XCreatePixmap (s->dpy, s->b, width, height, s->xgwa.depth);
+      xftdraw = XftDrawCreate (s->dpy, w->pixmap, s->xgwa.visual,
+                               s->xgwa.colormap);
 
-      if (w->width <= 0)  w->width  = 1;
-      if (w->height <= 0) w->height = 1;
+      gcv.foreground = se->xftcolor_fg.pixel;
+      gc_fg = XCreateGC (s->dpy, w->pixmap, GCForeground, &gcv);
 
-      w->pixmap = XCreatePixmap (s->dpy, s->b, w->width, w->height, 1L);
-      w->mask   = XCreatePixmap (s->dpy, s->b, w->width, w->height, 1L);
+      gcv.foreground = se->xftcolor_bg.pixel;
+      gc_bg = XCreateGC (s->dpy, w->pixmap, GCForeground, &gcv);
 
-      gcv.font = se->font->fid;
-      gcv.foreground = 0L;
-      gcv.background = 1L;
-      gc0 = XCreateGC (s->dpy, w->pixmap, GCFont|GCForeground|GCBackground,
-                       &gcv);
-      gcv.foreground = 1L;
-      gcv.background = 0L;
-      gc1 = XCreateGC (s->dpy, w->pixmap, GCFont|GCForeground|GCBackground,
-                       &gcv);
+      gcv.foreground = BlackPixelOfScreen (s->xgwa.screen);
+      gc_black = XCreateGC (s->dpy, w->pixmap, GCForeground, &gcv);
 
-      XFillRectangle (s->dpy, w->mask,   gc0, 0, 0, w->width, w->height);
-      XFillRectangle (s->dpy, w->pixmap, gc0, 0, 0, w->width, w->height);
+      XFillRectangle (s->dpy, w->pixmap, gc_black, 0, 0, width, height);
 
 # ifdef DEBUG
       if (s->debug_p)
         {
           /* bounding box (behind the characters) */
-          XDrawRectangle (s->dpy, w->pixmap, (se->dark_p ? gc0 : gc1),
-                          0, 0, w->width-1, w->height-1);
-          XDrawRectangle (s->dpy, w->mask,   gc1,
-                          0, 0, w->width-1, w->height-1);
-        }
-
-      if (s->debug_p > 1)
-        {
-          /* bounding box (behind *each* character) */
-          char *ss;
-          int x = 0;
-          for (ss = txt; *ss; ss++)
-            {
-              XTextExtents (se->font, ss, 1, &dir, &ascent, &descent, &overall);
-              XDrawRectangle (s->dpy, w->pixmap, (se->dark_p ? gc0 : gc1),
-                              x, w->ascent - overall.ascent, 
-                              overall.width, 
-                              overall.ascent + overall.descent);
-              XDrawRectangle (s->dpy, w->mask,   gc1,
-                              x, w->ascent - overall.ascent, 
-                              overall.width,
-                              overall.ascent + overall.descent);
-
-              XDrawRectangle (s->dpy, w->pixmap, (se->dark_p ? gc0 : gc1),
-                              x - overall.lbearing, w->ascent - overall.ascent, 
-                              overall.rbearing, 
-                              overall.ascent + overall.descent);
-              XDrawRectangle (s->dpy, w->mask,   gc1,
-                              x - overall.lbearing, w->ascent - overall.ascent, 
-                              overall.rbearing,
-                              overall.ascent + overall.descent);
-
-
-              x += overall.width;
-            }
+          XDrawRectangle (s->dpy, w->pixmap, (se->dark_p ? gc_bg : gc_fg),
+                          0, 0, width-1, height-1);
         }
 # endif /* DEBUG */
 
-      /* Draw foreground text */
-      XDrawString (s->dpy, w->pixmap, gc1, -w->lbearing, w->ascent,
-                   txt, strlen(txt));
-
-      /* Cheesy hack to draw a border */
-      /* (I should be able to do this in i*2 time instead of i*i time,
-         but I can't get it right, so fuck it.) */
-      XSetFunction (s->dpy, gc1, GXor);
+      /* Draw background text for border */
       for (i = -bw; i <= bw; i++)
         for (j = -bw; j <= bw; j++)
-          XCopyArea (s->dpy, w->pixmap, w->mask, gc1,
-                     0, 0, w->width, w->height,
-                     i, j);
+          XftDrawStringUtf8 (xftdraw, &se->xftcolor_bg, se->xftfont,
+                             -w->lbearing + i, w->ascent + j,
+                             (FcChar8 *) txt, strlen(txt));
+
+      /* Draw foreground text */
+      XftDrawStringUtf8 (xftdraw, &se->xftcolor_fg, se->xftfont,
+                         -w->lbearing, w->ascent,
+                         (FcChar8 *) txt, strlen(txt));
 
 # ifdef DEBUG
       if (s->debug_p)
         {
-          XSetFunction (s->dpy, gc1, GXcopy);
-          if (w->ascent != w->height)
+          if (w->ascent != height)
             {
               /* baseline (on top of the characters) */
-              XDrawLine (s->dpy, w->pixmap, (se->dark_p ? gc0 : gc1),
-                         0, w->ascent, w->width-1, w->ascent);
-              XDrawLine (s->dpy, w->mask,   gc1,
-                         0, w->ascent, w->width-1, w->ascent);
+              XDrawLine (s->dpy, w->pixmap, (se->dark_p ? gc_bg : gc_fg),
+                         0, w->ascent, width-1, w->ascent);
             }
 
-          if (w->lbearing != 0)
+          if (w->lbearing < 0)
             {
               /* left edge of charcell */
-              XDrawLine (s->dpy, w->pixmap, (se->dark_p ? gc0 : gc1),
-                         w->lbearing, 0, w->lbearing, w->height-1);
-              XDrawLine (s->dpy, w->mask,   gc1,
-                         w->lbearing, 0, w->lbearing, w->height-1);
+              XDrawLine (s->dpy, w->pixmap, (se->dark_p ? gc_bg : gc_fg),
+                         -w->lbearing, 0,
+                         -w->lbearing, height-1);
             }
 
           if (w->rbearing != w->width)
             {
               /* right edge of charcell */
-              XDrawLine (s->dpy, w->pixmap, (se->dark_p ? gc0 : gc1),
-                         w->rbearing, 0, w->rbearing, w->height-1);
-              XDrawLine (s->dpy, w->mask,   gc1,
-                         w->rbearing, 0, w->rbearing, w->height-1);
+              XDrawLine (s->dpy, w->pixmap, (se->dark_p ? gc_bg : gc_fg),
+                         w->width - w->lbearing, 0,
+                         w->width - w->lbearing, height-1);
             }
         }
 # endif /* DEBUG */
 
-      XFreeGC (s->dpy, gc0);
-      XFreeGC (s->dpy, gc1);
+      w->mask = make_mask (s->xgwa.screen, s->xgwa.visual, w->pixmap);
+
+      XftDrawDestroy (xftdraw);
+      XFreeGC (s->dpy, gc_fg);
+      XFreeGC (s->dpy, gc_bg);
+      XFreeGC (s->dpy, gc_black);
     }
 
   w->text = strdup (txt);
@@ -668,16 +731,21 @@ free_sentence (state *s, sentence *se)
   int i;
   for (i = 0; i < se->nwords; i++)
     free_word (s, se->words[i]);
-  if (se->words) free (se->words);
-
-  if (se->fg.flags)
-    XFreeColors (s->dpy, s->xgwa.colormap, &se->fg.pixel, 1, 0);
-  if (se->bg.flags)
-    XFreeColors (s->dpy, s->xgwa.colormap, &se->bg.pixel, 1, 0);
+  if (se->words)
+    free (se->words);
+  if (se->font_name)
+    free (se->font_name);
+  if (se->fg_gc)
+    XFreeGC (s->dpy, se->fg_gc);
 
-  if (se->font_name) free (se->font_name);
-  if (se->font) XFreeFont (s->dpy, se->font);
-  if (se->fg_gc) XFreeGC (s->dpy, se->fg_gc);
+  if (se->xftfont)
+    {
+      XftFontClose (s->dpy, se->xftfont);
+      XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap,
+                    &se->xftcolor_fg);
+      XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap,
+                    &se->xftcolor_bg);
+    }
 
   free (se);
 }
@@ -705,53 +773,56 @@ split_words (state *s, sentence *se)
   word **words2;
   int nwords2 = 0;
   int i, j;
+
+  char ***word_chars = (char ***) malloc (se->nwords * sizeof(*word_chars));
   for (i = 0; i < se->nwords; i++)
-    nwords2 += strlen (se->words[i]->text);
+    {
+      int L;
+      word *ow = se->words[i];
+      word_chars[i] = utf8_split (ow->text, &L);
+      nwords2 += L;
+    }
 
   words2 = (word **) calloc (nwords2, sizeof(*words2));
 
   for (i = 0, j = 0; i < se->nwords; i++)
     {
-      word *ow = se->words[i];
-      int L = strlen (ow->text);
+      char **chars = word_chars[i];
+      word *parent = se->words[i];
+      int x  = parent->x;
+      int y  = parent->y;
+      int sx = parent->start_x;
+      int sy = parent->start_y;
+      int tx = parent->target_x;
+      int ty = parent->target_y;
       int k;
 
-      int x  = ow->x;
-      int y  = ow->y;
-      int sx = ow->start_x;
-      int sy = ow->start_y;
-      int tx = ow->target_x;
-      int ty = ow->target_y;
-
-      for (k = 0; k < L; k++)
+      for (k = 0; chars[k]; k++)
         {
-          char t2[2];
-          word *w2;
-          int xoff, yoff;
-
-          t2[0] = ow->text[k];
-          t2[1] = 0;
-          w2 = new_word (s, se, t2, True);
+          char *t2 = chars[k];
+          word *w2 = new_word (s, se, t2, True);
           words2[j++] = w2;
 
-          xoff = (w2->lbearing - ow->lbearing);
-          yoff = (ow->ascent - w2->ascent);
+          w2->x = x;
+          w2->y = y;
+          w2->start_x = sx;
+          w2->start_y = sy;
+          w2->target_x = tx;
+          w2->target_y = ty;
 
-          w2->x        = x  + xoff;
-          w2->y        = y  + yoff;
-          w2->start_x  = sx + xoff;
-          w2->start_y  = sy + yoff;
-          w2->target_x = tx + xoff;
-          w2->target_y = ty + yoff;
-
-          x  += w2->rbearing;
-          sx += w2->rbearing;
-          tx += w2->rbearing;
+          x  += w2->width;
+          sx += w2->width;
+          tx += w2->width;
         }
 
-      free_word (s, ow);
-      se->words[i] = 0;
+      /* This is not invariant when kerning is involved! */
+      /* if (x != parent->x + parent->width) abort(); */
+
+      free (chars);  /* but we retain its contents */
+      free_word (s, parent);
     }
+  if (j != nwords2) abort();
+  free (word_chars);
   free (se->words);
 
   se->words = words2;
@@ -766,7 +837,7 @@ static void
 scatter_sentence (state *s, sentence *se)
 {
   int i = 0;
-  int off = 100;
+  int off = s->border_width * 4 + 2;
 
   int flock_p = ((random() % 4) == 0);
   int mode = (flock_p ? (random() % 12) : 0);
@@ -776,69 +847,32 @@ scatter_sentence (state *s, sentence *se)
       word *w = se->words[i];
       int x, y;
       int r = (flock_p ? mode : (random() % 4));
-      switch (r)
-        {
-          /* random positions on the edges */
-
-        case 0:
-          x = -off - w->width;
-          y = random() % s->xgwa.height;
-          break;
-        case 1:
-          x = off + s->xgwa.width;
-          y = random() % s->xgwa.height;
-          break;
-        case 2:
-          x = random() % s->xgwa.width;
-          y = -off - w->height;
-          break;
-        case 3:
-          x = random() % s->xgwa.width;
-          y = off + s->xgwa.height;
-          break;
-
-          /* straight towards the edges */
-
-        case 4:
-          x = -off - w->width;
-          y = w->target_y;
-          break;
-        case 5:
-          x = off + s->xgwa.width;
-          y = w->target_y;
-          break;
-        case 6:
-          x = w->target_x;
-          y = -off - w->height;
-          break;
-        case 7:
-          x = w->target_x;
-          y = off + s->xgwa.height;
-          break;
-
-          /* corners */
-
-        case 8:
-          x = -off - w->width;
-          y = -off - w->height;
-          break;
-        case 9:
-          x = -off - w->width;
-          y =  off + s->xgwa.height;
-          break;
-        case 10:
-          x =  off + s->xgwa.width;
-          y =  off + s->xgwa.height;
-          break;
-        case 11:
-          x =  off + s->xgwa.width;
-          y = -off - w->height;
-          break;
-
-        default:
-          abort();
-          break;
-        }
+      int left   = -(off + w->rbearing);
+      int top    = -(off + w->descent);
+      int right  = off - w->lbearing + s->xgwa.width;
+      int bottom = off + w->ascent + s->xgwa.height;
+
+      switch (r) {
+      /* random positions on the edges */
+      case 0:  x = left;  y = random() % s->xgwa.height; break;
+      case 1:  x = right; y = random() % s->xgwa.height; break;
+      case 2:  x = random() % s->xgwa.width; y = top;    break;
+      case 3:  x = random() % s->xgwa.width; y = bottom; break;
+
+      /* straight towards the edges */
+      case 4:  x = left;  y = w->target_y;  break;
+      case 5:  x = right; y = w->target_y;  break;
+      case 6:  x = w->target_x; y = top;    break;
+      case 7:  x = w->target_x; y = bottom; break;
+
+      /* corners */
+      case 8:  x = left;  y = top;    break;
+      case 9:  x = left;  y = bottom; break;
+      case 10: x = right; y = top;    break;
+      case 11: x = right; y = bottom; break;
+
+      default: abort(); break;
+      }
 
       if (se->anim_state == IN)
         {
@@ -898,7 +932,7 @@ aim_sentence (state *s, sentence *se)
     }
 
   nticks = ((se->words[0]->start_x - se->words[0]->target_x)
-            / (s->speed * 10));
+            / (s->speed * 7));
   nticks *= (frand(0.9) + frand(0.9) + frand(0.9));
 
   if (nticks < 2)
@@ -954,49 +988,36 @@ sort_sentences (state *s)
 static void
 recolor (state *s, sentence *se)
 {
-  if (se->fg.flags)
-    XFreeColors (s->dpy, s->xgwa.colormap, &se->fg.pixel, 1, 0);
-  if (se->bg.flags)
-    XFreeColors (s->dpy, s->xgwa.colormap, &se->bg.pixel, 1, 0);
-
-  se->fg.flags  = DoRed|DoGreen|DoBlue;
-  se->bg.flags  = DoRed|DoGreen|DoBlue;
-
-  switch (random() % 2)
+  XRenderColor fg, bg;
+
+  fg.red   = (random() % 0x5555) + 0xAAAA;
+  fg.green = (random() % 0x5555) + 0xAAAA;
+  fg.blue  = (random() % 0x5555) + 0xAAAA;
+  fg.alpha = 0xFFFF;
+  bg.red   = (random() % 0x5555);
+  bg.green = (random() % 0x5555);
+  bg.blue  = (random() % 0x5555);
+  bg.alpha = 0xFFFF;
+  se->dark_p = False;
+
+  if (random() & 1)
     {
-    case 0:   /* bright fg, dim bg */
-      se->fg.red    = (random() % 0x8888) + 0x8888;
-      se->fg.green  = (random() % 0x8888) + 0x8888;
-      se->fg.blue   = (random() % 0x8888) + 0x8888;
-      se->bg.red    = (random() % 0x5555);
-      se->bg.green  = (random() % 0x5555);
-      se->bg.blue   = (random() % 0x5555);
-      break;
-
-    case 1:   /* bright bg, dim fg */
-      se->fg.red    = (random() % 0x4444);
-      se->fg.green  = (random() % 0x4444);
-      se->fg.blue   = (random() % 0x4444);
-      se->bg.red    = (random() % 0x4444) + 0xCCCC;
-      se->bg.green  = (random() % 0x4444) + 0xCCCC;
-      se->bg.blue   = (random() % 0x4444) + 0xCCCC;
-      break;
-
-    default:
-      abort();
-      break;
+      XRenderColor swap = fg; fg = bg; bg = swap;
+      se->dark_p = True;
     }
 
-# ifdef DEBUG
-  if (s->debug_p)
-    se->dark_p = (se->fg.red*2 + se->fg.green*3 + se->fg.blue <
-                  se->bg.red*2 + se->bg.green*3 + se->bg.blue);
-# endif /* DEBUG */
+  if (se->xftfont)
+    {
+      XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap,
+                    &se->xftcolor_fg);
+      XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap,
+                    &se->xftcolor_bg);
+    }
 
-  if (XAllocColor (s->dpy, s->xgwa.colormap, &se->fg))
-    XSetForeground (s->dpy, se->fg_gc, se->fg.pixel);
-  if (XAllocColor (s->dpy, s->xgwa.colormap, &se->bg))
-    XSetBackground (s->dpy, se->fg_gc, se->bg.pixel);
+  XftColorAllocValue (s->dpy, s->xgwa.visual, s->xgwa.colormap, &fg,
+                     &se->xftcolor_fg);
+  XftColorAllocValue (s->dpy, s->xgwa.visual, s->xgwa.colormap, &bg,
+                     &se->xftcolor_bg);
 }
 
 
@@ -1082,12 +1103,18 @@ populate_sentence (state *s, sentence *se)
             break;             /* If EOF after some words, end of sentence. */
         }
 
-      if (! se->font)           /* Got a word: need a font now */
+      if (! se->xftfont)           /* Got a word: need a font now */
         {
+          XGlyphInfo extents;
           pick_font (s, se);
-          if (y < se->font->ascent)
-            y += se->font->ascent;
-          space = XTextWidth (se->font, " ", 1);
+          if (y < se->xftfont->ascent)
+            y += se->xftfont->ascent;
+
+          /* Measure the space character to figure out how much room to
+             leave between words (since we don't actually render that.) */
+          XftTextExtentsUtf8 (s->dpy, se->xftfont, (FcChar8 *) " ", 1,
+                              &extents);
+          space = extents.xOff;
         }
 
       w = new_word (s, se, txt, !se->move_chars_p);
@@ -1120,14 +1147,14 @@ populate_sentence (state *s, sentence *se)
           line_start = se->nwords;
 
           x = left;
-          y += se->font->ascent;
+          y += se->xftfont->ascent + se->xftfont->descent;
 
           /* If we're close to the bottom of the screen, stop, and 
              unread the current word.  (But not if this is the first
              word, otherwise we might just get stuck on it.)
            */
           if (se->nwords > 0 &&
-              y + se->font->ascent > s->xgwa.height)
+              y + se->xftfont->ascent + se->xftfont->descent > s->xgwa.height)
             {
               unread_word (s, w);
               /* done = True; */
@@ -1135,17 +1162,17 @@ populate_sentence (state *s, sentence *se)
             }
         }
 
-      w->target_x = x + w->lbearing;
-      w->target_y = y - w->ascent;
+      w->target_x = x;
+      w->target_y = y;
 
-      x += w->rbearing + space;
+      x += w->width + space;
       se->width = x;
 
       if (se->nwords >= (array_size - 1))
         {
           array_size += 100;
-          se->words = (word **) realloc (se->words,
-                                         array_size * sizeof(*se->words));
+          se->words = (word **)
+            realloc (se->words, array_size * sizeof(*se->words));
           if (!se->words)
             {
               fprintf (stderr, "%s: out of memory (%d words)\n",
@@ -1191,22 +1218,26 @@ populate_sentence (state *s, sentence *se)
 /* Render a single word object to the screen.
  */
 static void
-draw_word (state *s, sentence *se, word *w)
+draw_word (state *s, sentence *se, word *word)
 {
-  if (! w->pixmap) return;
-
-  if (w->x + w->width < 0 ||
-      w->y + w->height < 0 ||
-      w->x > s->xgwa.width ||
-      w->y > s->xgwa.height)
+  int x, y, w, h;
+  if (! word->pixmap) return;
+
+  x = word->x + word->lbearing;
+  y = word->y - word->ascent;
+  w = word->rbearing - word->lbearing;
+  h = word->ascent + word->descent;
+
+  if (x + w < 0 ||
+      y + h < 0 ||
+      x > s->xgwa.width ||
+      y > s->xgwa.height)
     return;
 
-  XSetClipMask (s->dpy, se->fg_gc, w->mask);
-  XSetClipOrigin (s->dpy, se->fg_gc, w->x, w->y);
-  XCopyPlane (s->dpy, w->pixmap, s->b, se->fg_gc,
-              0, 0, w->width, w->height,
-              w->x, w->y,
-              1L);
+  XSetClipMask (s->dpy, se->fg_gc, word->mask);
+  XSetClipOrigin (s->dpy, se->fg_gc, x, y);
+  XCopyArea (s->dpy, word->pixmap, s->b, se->fg_gc,
+             0, 0, w, h, x, y);
 }
 
 
@@ -1371,7 +1402,8 @@ draw_sentence (state *s, sentence *se)
 }
 
 
-#ifdef DEBUG
+#ifdef DEBUG    /* All of this stuff is for -debug-metrics mode. */
+
 
 static Pixmap
 scale_ximage (Screen *screen, Window window, XImage *img, int scale,
@@ -1456,13 +1488,18 @@ fontglide_draw_metrics (state *s)
 {
   unsigned int margin = (s->debug_metrics_antialiasing_p ? 2 : 0);
 
-  char txt[2], txt2[80];
+  char txt[2], utxt[3], txt2[80];
+  XChar2b *txt3 = 0;
   const char *fn = (s->font_override ? s->font_override : "fixed");
   XFontStruct *font = XLoadQueryFont (s->dpy, fn);
   XFontStruct *font2 = XLoadQueryFont (s->dpy, "fixed");
-  XCharStruct c, overall;
+  XCharStruct c, overall, fake_c;
   int dir, ascent, descent;
   int x, y;
+  XGlyphInfo extents;
+  XftFont *xftfont;
+  XftColor xftcolor;
+  XftDraw *xftdraw;
   int sc = s->debug_scale;
   GC gc;
   unsigned long red    = 0xFFFF0000;  /* so shoot me */
@@ -1470,7 +1507,7 @@ fontglide_draw_metrics (state *s)
   unsigned long blue   = 0xFF6666FF;
   unsigned long yellow = 0xFFFFFF00;
   unsigned long cyan   = 0xFF004040;
-  int i;
+  int i, j;
   Drawable dest = s->b ? s->b : s->window;
 
   if (sc < 1) sc = 1;
@@ -1478,6 +1515,29 @@ fontglide_draw_metrics (state *s)
   txt[0] = s->debug_metrics_p;
   txt[1] = 0;
 
+  /* Convert Latin1 to UTF-8. */
+  if ((unsigned char) txt[0] >= 0xC0)
+    {
+      utxt[0] = 0xC3;
+      utxt[1] = ((unsigned char) txt[0]) & 0xBF;
+      utxt[2] = 0;
+    }
+  else if ((unsigned char) txt[0] >= 0xA0)
+    {
+      utxt[0] = 0xC2;
+      utxt[1] = txt[0];
+      utxt[2] = 0;
+    }
+  else
+    {
+      utxt[0] = txt[0];
+      utxt[1] = 0;
+    }
+
+  txt3 = utf8_to_XChar2b (utxt, 0);
+
+  if (! font) font = font2;
+
   gc  = XCreateGC (s->dpy, dest, 0, 0);
   XSetFont (s->dpy, gc,  font->fid);
 
@@ -1485,6 +1545,21 @@ fontglide_draw_metrics (state *s)
   jwxyz_XSetAntiAliasing (s->dpy, gc, False);
 # endif
 
+  xftfont = XftFontOpenXlfd (s->dpy, screen_number(s->xgwa.screen), fn);
+  if (! xftfont)
+    xftfont = XftFontOpenXlfd (s->dpy, screen_number(s->xgwa.screen), "fixed");
+  if (! xftfont)
+    abort();
+
+
+  xftdraw = XftDrawCreate (s->dpy, dest, s->xgwa.visual,
+                           s->xgwa.colormap);
+  XftColorAllocName (s->dpy, s->xgwa.visual, s->xgwa.colormap, "white",
+                     &xftcolor);
+  XftTextExtentsUtf8 (s->dpy, xftfont, (FcChar8 *) utxt, strlen(utxt),
+                      &extents);
+
+
   XTextExtents (font, txt, strlen(txt), 
                 &dir, &ascent, &descent, &overall);
   c = (s->debug_metrics_p >= font->min_char_or_byte2
@@ -1494,21 +1569,54 @@ fontglide_draw_metrics (state *s)
   XSetForeground (s->dpy, gc, BlackPixelOfScreen (s->xgwa.screen));
   XFillRectangle (s->dpy, dest, gc, 0, 0, s->xgwa.width, s->xgwa.height);
 
-  x = (s->xgwa.width  - overall.width) / 2;
-  y = (s->xgwa.height - (2 * sc * (ascent + descent))) / 2;
-
-  for (i = 0; i < 2; i++)
+  for (j = 0; j < 2; j++) {
+    Bool xft_p = (j != 0);
+    int ww = s->xgwa.width / 2 - 20;
+    x = (ww - overall.width) / 2;
+    y = (s->xgwa.height - (2 * sc * (ascent + descent))) / 2;
+    
+   for (i = 0; i < 2; i++)
     {
-      XCharStruct cc = (i == 0 ? c : overall);
-      int x1 = s->xgwa.width * 0.15;
-      int x2 = s->xgwa.width * 0.85;
-      int x3 = s->xgwa.width;
+      int xoff = (j == 0 ? 0 : ww + 20);
+      XCharStruct cc;
+      int x1 = xoff + ww * 0.18;
+      int x2 = xoff + ww * 0.82;
+      int x3 = xoff + ww;
+      int pixw, pixh;
+      Pixmap p;
+
+      memset (&fake_c, 0, sizeof(fake_c));
+
+      if (!xft_p && i == 0)
+        cc = c;
+      else if (!xft_p && i == 1)
+        cc = overall;
+      else if (xft_p && i == 0)
+        {
+          /* Measure the glyph in the Xft way */
+          XGlyphInfo extents;
+          XftTextExtentsUtf8 (s->dpy, xftfont, (FcChar8 *) utxt, strlen(utxt),
+                              &extents);
+          fake_c.lbearing = -extents.x;
+          fake_c.rbearing = extents.width - extents.x;
+          fake_c.ascent   = extents.y;
+          fake_c.descent  = extents.height - extents.y;
+          fake_c.width    = extents.xOff;
+          cc = fake_c;
+        }
+      else if (xft_p)
+        {
+          /* Measure the glyph in the 16-bit way */
+          int dir, ascent, descent;
+          XTextExtents16 (font, txt3, 1, &dir, &ascent, &descent, &fake_c);
+          cc = fake_c;
+        }
 
-      int pixw = margin * 2 + cc.rbearing - cc.lbearing;
-      int pixh = margin * 2 + cc.ascent + cc.descent;
-      Pixmap p = (pixw > 0 && pixh > 0
-                  ? XCreatePixmap (s->dpy, dest, pixw, pixh, s->xgwa.depth)
-                  : 0);
+      pixw = margin * 2 + cc.rbearing - cc.lbearing;
+      pixh = margin * 2 + cc.ascent + cc.descent;
+      p = (pixw > 0 && pixh > 0
+           ? XCreatePixmap (s->dpy, dest, pixw, pixh, s->xgwa.depth)
+           : 0);
 
       if (p)
         {
@@ -1525,10 +1633,28 @@ fontglide_draw_metrics (state *s)
 # ifdef HAVE_COCOA
           jwxyz_XSetAntiAliasing (s->dpy, gc2, s->debug_metrics_antialiasing_p);
 # endif
-          XDrawString (s->dpy, p, gc2,
-                       -cc.lbearing + margin,
-                       cc.ascent + margin,
-                       txt, strlen(txt));
+
+          if (xft_p && i == 0)
+            {
+              XftDraw *xftdraw2 = XftDrawCreate (s->dpy, p, s->xgwa.visual,
+                                                 s->xgwa.colormap);
+              XftDrawStringUtf8 (xftdraw2, &xftcolor, xftfont,
+                                 -cc.lbearing + margin,
+                                 cc.ascent + margin,
+                                 (FcChar8 *) utxt, strlen(utxt));
+              XftDrawDestroy (xftdraw2);
+            }
+          else if (xft_p)
+            XDrawString16 (s->dpy, p, gc2,
+                           -cc.lbearing + margin,
+                           cc.ascent + margin,
+                           txt3, 1);
+          else
+            XDrawString (s->dpy, p, gc2,
+                         -cc.lbearing + margin,
+                         cc.ascent + margin,
+                         txt, strlen(txt));
+
           {
             unsigned x2, y2;
             XImage *img = XGetImage (s->dpy, p, 0, 0, pixw, pixh,
@@ -1557,7 +1683,9 @@ fontglide_draw_metrics (state *s)
                       if (ink & 0xFFFFFF)
                       {
                         XSetFont (s->dpy, gc, font2->fid);
-                        XDrawString (s->dpy, dest, gc, 10, 40, "Ink escape!", 11);
+                        XDrawString (s->dpy, dest, gc,
+                                     xoff + 10, 40,
+                                     "Ink escape!", 11);
                       }
                   }
 
@@ -1574,7 +1702,8 @@ fontglide_draw_metrics (state *s)
                                     img, margin, margin + h - 1, 0, w))
                       {
                         XSetFont (s->dpy, gc, font2->fid);
-                        XDrawString (s->dpy, dest, gc, 10, 60,
+                        XDrawString (s->dpy, dest, gc, 
+                                     xoff + 10, 60,
                                      "Wasted space: ", 14);
                       }
                   }
@@ -1629,7 +1758,7 @@ fontglide_draw_metrics (state *s)
 
           XCopyArea (s->dpy, p2, dest, gc,
                      0, 0, sc*pixw, sc*pixh,
-                     x + sc * (cc.lbearing - margin),
+                     xoff + x + sc * (cc.lbearing - margin),
                      y - sc * (cc.ascent + margin));
           XFreePixmap (s->dpy, p);
           XFreePixmap (s->dpy, p2);
@@ -1643,23 +1772,41 @@ fontglide_draw_metrics (state *s)
 # ifdef HAVE_COCOA
           jwxyz_XSetAntiAliasing (s->dpy, gc, s->debug_metrics_antialiasing_p);
 # endif
-          sprintf (txt2, "%c        [XX%cXX]    [%c%c%c%c]",
-                   s->debug_metrics_p, s->debug_metrics_p,
-                   s->debug_metrics_p, s->debug_metrics_p,
-                   s->debug_metrics_p, s->debug_metrics_p);
-          XDrawString (s->dpy, dest, gc,
-                       x + (sc*cc.rbearing/2) - cc.rbearing/2, ascent + 10,
-                       txt2, strlen(txt2));
+          sprintf (txt2, "%s        [XX%sXX]    [%s%s%s%s]",
+                   (xft_p ? utxt : txt),
+                   (xft_p ? utxt : txt),
+                   (xft_p ? utxt : txt),
+                   (xft_p ? utxt : txt),
+                   (xft_p ? utxt : txt),
+                   (xft_p ? utxt : txt));
+
+          if (xft_p)
+            XftDrawStringUtf8 (xftdraw, &xftcolor, xftfont,
+                               xoff + x/2 + (sc*cc.rbearing/2) - cc.rbearing/2,
+                               ascent + 10,
+                             (FcChar8 *) txt2, strlen(txt2));
+          else
+            XDrawString (s->dpy, dest, gc,
+                         xoff + x/2 + (sc*cc.rbearing/2) - cc.rbearing/2,
+                         ascent + 10,
+                         txt2, strlen(txt2));
 # ifdef HAVE_COCOA
           jwxyz_XSetAntiAliasing (s->dpy, gc, False);
 # endif
           XSetFont (s->dpy, gc, font2->fid);
-          sprintf (txt2, "%c %3d 0%03o 0x%02x%s",
-                   s->debug_metrics_p, s->debug_metrics_p,
-                   s->debug_metrics_p, s->debug_metrics_p,
-                   (txt[0] < font->min_char_or_byte2 ? " *" : ""));
+          if (xft_p && utxt[1])
+            sprintf (txt2, "0%03o 0%03o   %02x %02x",
+                     (unsigned char) utxt[0], (unsigned char) utxt[1],
+                     (unsigned char) utxt[0], (unsigned char) utxt[1]);
+          else if (xft_p)
+            txt2[0] = 0;
+          else
+            sprintf (txt2, "%c %3d 0%03o 0x%02x%s",
+                     s->debug_metrics_p, s->debug_metrics_p,
+                     s->debug_metrics_p, s->debug_metrics_p,
+                     (txt[0] < font->min_char_or_byte2 ? " *" : ""));
           XDrawString (s->dpy, dest, gc,
-                       10, 20,
+                       xoff + 10, 20,
                        txt2, strlen(txt2));
         }
 
@@ -1667,23 +1814,32 @@ fontglide_draw_metrics (state *s)
       jwxyz_XSetAntiAliasing (s->dpy, gc, True);
 # endif
 
-      XSetFont (s->dpy, gc, font2->fid);
-
-      XSetForeground (s->dpy, gc, red);
+      {
+        const char *ss = (j == 0
+                          ? (i == 0 ? "char" : "overall")
+                          : (i == 0 ? "utf8" : "16 bit"));
+        XSetFont (s->dpy, gc, font2->fid);
 
-      sprintf (txt2, "%s ascent %d",
-               (i == 0 ? "char" : "overall"),
-               ascent);
-      XDrawString (s->dpy, dest, gc, 10, y - sc*ascent - 2,
-                   txt2, strlen(txt2));
-      XDrawLine (s->dpy, dest, gc, 0, y - sc*ascent,  x3, y - sc*ascent);
+        XSetForeground (s->dpy, gc, red);
 
-      sprintf (txt2, "%s descent %d",
-               (i == 0 ? "char" : "overall"),
-               descent);
-      XDrawString (s->dpy, dest, gc, 10, y + sc*descent - 2,
-                   txt2, strlen(txt2));
-      XDrawLine (s->dpy, dest, gc, 0, y + sc*descent, x3, y + sc*descent);
+        sprintf (txt2, "%s ascent %d", ss, ascent);
+        XDrawString (s->dpy, dest, gc, 
+                     xoff + 10,
+                     y - sc*ascent - 2,
+                     txt2, strlen(txt2));
+        XDrawLine (s->dpy, dest, gc,
+                   xoff, y - sc*ascent,
+                   x3,   y - sc*ascent);
+
+        sprintf (txt2, "%s descent %d", ss, descent);
+        XDrawString (s->dpy, dest, gc, 
+                     xoff + 10,
+                     y + sc*descent - 2,
+                     txt2, strlen(txt2));
+        XDrawLine (s->dpy, dest, gc, 
+                   xoff, y + sc*descent,
+                   x3,   y + sc*descent);
+      }
 
 
       /* ascent, descent, baseline */
@@ -1692,21 +1848,26 @@ fontglide_draw_metrics (state *s)
 
       sprintf (txt2, "ascent %d", cc.ascent);
       if (cc.ascent != 0)
-        XDrawString (s->dpy, dest, gc, x1, y - sc*cc.ascent - 2,
+        XDrawString (s->dpy, dest, gc,
+                     x1, y - sc*cc.ascent - 2,
                      txt2, strlen(txt2));
       XDrawLine (s->dpy, dest, gc,
-                 x1, y - sc*cc.ascent,  x2, y - sc*cc.ascent);
+                 x1, y - sc*cc.ascent,
+                 x2, y - sc*cc.ascent);
 
       sprintf (txt2, "descent %d", cc.descent);
       if (cc.descent != 0)
-        XDrawString (s->dpy, dest, gc, x1, y + sc*cc.descent - 2,
+        XDrawString (s->dpy, dest, gc,
+                     x1, y + sc*cc.descent - 2,
                      txt2, strlen(txt2));
       XDrawLine (s->dpy, dest, gc,
-                 x1, y + sc*cc.descent, x2, y + sc*cc.descent);
+                 x1, y + sc*cc.descent,
+                 x2, y + sc*cc.descent);
 
       XSetForeground (s->dpy, gc, yellow);
       strcpy (txt2, "baseline");
-      XDrawString (s->dpy, dest, gc, x1, y - 2,
+      XDrawString (s->dpy, dest, gc,
+                   x1, y - 2,
                    txt2, strlen(txt2));
       XDrawLine (s->dpy, dest, gc, x1, y, x2, y);
 
@@ -1717,20 +1878,21 @@ fontglide_draw_metrics (state *s)
 
       strcpy (txt2, "origin");
       XDrawString (s->dpy, dest, gc,
-                   x + 2, y + sc*(descent + 10),
+                   xoff + x + 2,
+                   y + sc*(descent + 10),
                    txt2, strlen(txt2));
       XDrawLine (s->dpy, dest, gc,
-                 x, y - sc*(ascent  - 10),
-                 x, y + sc*(descent + 10));
+                 xoff + x, y - sc*(ascent  - 10),
+                 xoff + x, y + sc*(descent + 10));
 
       sprintf (txt2, "width %d", cc.width);
       XDrawString (s->dpy, dest, gc,
-                   x + sc*cc.width + 2,
+                   xoff + x + sc*cc.width + 2,
                    y + sc*(descent + 10) + 10, 
                    txt2, strlen(txt2));
       XDrawLine (s->dpy, dest, gc,
-                 x + sc*cc.width, y - sc*(ascent  - 10),
-                 x + sc*cc.width, y + sc*(descent + 10));
+                 xoff + x + sc*cc.width, y - sc*(ascent  - 10),
+                 xoff + x + sc*cc.width, y + sc*(descent + 10));
 
 
       /* lbearing, rbearing */
@@ -1738,23 +1900,26 @@ fontglide_draw_metrics (state *s)
       XSetForeground (s->dpy, gc, green);
 
       sprintf (txt2, "lbearing %d", cc.lbearing);
-      XDrawString (s->dpy, dest, gc, x + sc*cc.lbearing + 2,
+      XDrawString (s->dpy, dest, gc,
+                   xoff + x + sc*cc.lbearing + 2,
                    y + sc * descent + 30, 
                    txt2, strlen(txt2));
       XDrawLine (s->dpy, dest, gc,
-                 x + sc*cc.lbearing, y - sc*ascent,
-                 x + sc*cc.lbearing, y + sc*descent + 20);
+                 xoff + x + sc*cc.lbearing, y - sc*ascent,
+                 xoff + x + sc*cc.lbearing, y + sc*descent + 20);
 
       sprintf (txt2, "rbearing %d", cc.rbearing);
-      XDrawString (s->dpy, dest, gc, x + sc*cc.rbearing + 2,
+      XDrawString (s->dpy, dest, gc,
+                   xoff + x + sc*cc.rbearing + 2,
                    y + sc * descent + 40, 
                    txt2, strlen(txt2));
       XDrawLine (s->dpy, dest, gc,
-                 x + sc*cc.rbearing, y - sc*ascent,
-                 x + sc*cc.rbearing, y + sc*descent + 40);
+                 xoff + x + sc*cc.rbearing, y - sc*ascent,
+                 xoff + x + sc*cc.rbearing, y + sc*descent + 40);
 
       y += sc * (ascent + descent) * 2;
     }
+  }
 
   if (dest != s->window)
     XCopyArea (s->dpy, dest, s->window, s->bg_gc,
@@ -1762,7 +1927,14 @@ fontglide_draw_metrics (state *s)
 
   XFreeGC (s->dpy, gc);
   XFreeFont (s->dpy, font);
-  XFreeFont (s->dpy, font2);
+  if (font != font2)
+    XFreeFont (s->dpy, font2);
+
+  XftFontClose (s->dpy, xftfont);
+  XftColorFree (s->dpy, s->xgwa.visual, s->xgwa.colormap, &xftcolor);
+  XftDrawDestroy (xftdraw);
+  free (txt3);
+
   return s->frame_delay;
 }
 
@@ -2020,7 +2192,13 @@ static const char *fontglide_defaults [] = {
   "*usePty:             false",
   "*mode:               random",
   ".font:               (default)",
+
+  /* I'm not entirely clear on whether the charset of an XLFD has any
+     meaning when Xft is being used. */
   "*fontCharset:        iso8859-1",
+/*"*fontCharset:        iso10646-1", */
+/*"*fontCharset:        *-*",*/
+
   "*fontBorderWidth:    2",
   "*speed:              1.0",
   "*linger:             1.0",
index 0a197da12d2cdfbdd55ba5e3b030e0ea3288172c..552de9c9f19a63d748a06b610739db3e8edd97ae 100644 (file)
@@ -26,11 +26,7 @@ struct fps_state {
   char string[1024];
 
   /* for glx/fps-gl.c */
-# ifdef HAVE_GLBITMAP
-  unsigned long font_dlist;
-# else
   void *gl_fps_data;
-# endif
 
   GC draw_gc, erase_gc;
 
index a85cf0e833762216cf02d3a32f2170b503046574..22222bdcce63db6f665d6dae5b725ac550e357fd 100644 (file)
@@ -108,5 +108,5 @@ warranty.
 Barry Dmytro <badcherry@mailc.net>
 .SH CREDITS
 The color generation algorithm was borrowed from a friend <ZoeB>
-from #vegans@irc.blitzed.org.  Her site is http://beautifulfreak.net/.
+from #vegans@irc.blitzed.org.  Her site was [REDACTED].
 To see her original code in action visit her site.
index 054ac7ab94fa579567a9bd38655dfe3aac9675c6..92397730f415ccf4af05f977ba447a0c7eb695eb 100644 (file)
@@ -48,13 +48,14 @@ X_LIBS              = @X_LIBS@
 X_PRE_LIBS     = @X_PRE_LIBS@
 X_EXTRA_LIBS   = @X_EXTRA_LIBS@
 XMU_LIBS       = @XMU_LIBS@
+XFT_LIBS       = @XFT_LIBS@
 
 # Note: see comment in ../../driver/Makefile.in for explanation of X_LIBS, etc.
 #
 HACK_PRE       = $(LIBS) $(X_LIBS)
-HACK_POST     = $(X_PRE_LIBS) -lXt -lX11 $(XMU_LIBS) -lXext $(X_EXTRA_LIBS) -lm
+HACK_POST     = $(X_PRE_LIBS) $(XFT_LIBS) -lXt -lX11 $(XMU_LIBS) -lXext $(X_EXTRA_LIBS) -lm
 HACK_POST2     = @GL_LIBS@ @HACK_LIBS@ $(HACK_POST)
-HACK_LIBS      = $(HACK_PRE)                       $(HACK_POST2)
+HACK_LIBS      = $(HACK_PRE)           @ANIM_LIBS@ $(HACK_POST2)
 XPM_LIBS       = $(HACK_PRE)            @XPM_LIBS@ $(HACK_POST2)
 GLE_LIBS       = $(HACK_PRE) @GLE_LIBS@ @XPM_LIBS@ $(HACK_POST2)
 TEXT_LIBS      = @PTY_LIBS@
@@ -68,15 +69,20 @@ UTILS_BIN   = $(HACK_BIN)/../utils
 INCLUDES_1     = -I. -I$(srcdir) -I$(UTILS_SRC) -I$(HACK_SRC) -I../..
 INCLUDES       = $(INCLUDES_1) @INCLUDES@
 
-UTILDIR_OBJS   = $(UTILS_SRC)/colors.o $(UTILS_SRC)/hsv.o \
-                 $(UTILS_SRC)/resources.o $(UTILS_SRC)/usleep.o \
-                 $(UTILS_SRC)/visual.o $(UTILS_SRC)/visual-gl.o \
-                 $(UTILS_SRC)/yarandom.o $(UTILS_SRC)/xshm.o \
-                 $(UTILS_SRC)/textclient.o
+UTILDIR_OBJS   = $(UTILS_BIN)/colors.o $(UTILS_BIN)/grabclient.o \
+                 $(UTILS_BIN)/hsv.o $(UTILS_BIN)/resources.o \
+                 $(UTILS_BIN)/usleep.o $(UTILS_BIN)/visual.o \
+                 $(UTILS_BIN)/xmu.o $(UTILS_BIN)/xft.o \
+                 $(UTILS_BIN)/utf8wc.o $(UTILS_BIN)/logo.o \
+                 $(UTILS_BIN)/minixpm.o $(UTILS_BIN)/visual-gl.o \
+                 $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/xshm.o \
+                 $(UTILS_BIN)/textclient.o $(UTILS_BIN)/async_netdb.o \
+                 $(UTILS_BIN)/aligned_malloc.o $(UTILS_BIN)/thread_util.o \
+                 $(UTILS_BIN)/spline.o
 HACKDIR_OBJS   = $(HACK_SRC)/screenhack.o $(UTILS_SRC)/xlockmore.o \
                  $(HACK_SRC)/fps.o
 
-SRCS           = xscreensaver-gl-helper.c normals.c glxfonts.c fps-gl.c \
+SRCS           = xscreensaver-gl-helper.c normals.c fps-gl.c \
                  atlantis.c b_draw.c b_lockglue.c b_sphere.c bubble3d.c \
                  buildlwo.c cage.c dolphin.c gears.c lament.c lament_model.c \
                  moebius.c morph3d.c pipeobjs.c pipes.c rubik.c s1_1.c s1_2.c \
@@ -89,7 +95,7 @@ SRCS          = xscreensaver-gl-helper.c normals.c glxfonts.c fps-gl.c \
                  gflux.c stonerview.c stonerview-move.c stonerview-osc.c \
                  stonerview-view.c starwars.c glut_stroke.c glut_swidth.c \
                  gltext.c molecule.c dangerball.c sphere.c tube.c circuit.c \
-                 menger.c engine.c flipscreen3d.c font-ximage.c dnalogo.c \
+                 menger.c engine.c flipscreen3d.c dnalogo.c \
                  grab-ximage.c glsnake.c boxed.c glforestfire.c sballs.c \
                  cubenetic.c spheremonics.c marching.c lavalite.c rotator.c \
                  trackball.c gltrackball.c queens.c endgame.c chessmodels.c \
@@ -114,10 +120,11 @@ SRCS              = xscreensaver-gl-helper.c normals.c glxfonts.c fps-gl.c \
                  hilbert.c companion.c companion_quad.c companion_disc.c \
                  companion_heart.c tronbit.c tronbit_idle1.c tronbit_idle2.c \
                  tronbit_no.c tronbit_yes.c jwzgles.c kaleidocycle.c \
-                 quasicrystal.c unknownpleasures.c geodesic.c \
-                 projectiveplane.c winduprobot.c robot.c robot-wireframe.c
+                 quasicrystal.c unknownpleasures.c geodesic.c geodesicgears.c \
+                 projectiveplane.c winduprobot.c robot.c robot-wireframe.c \
+                 cityflow.c
 
-OBJS           = xscreensaver-gl-helper.o normals.o glxfonts.o fps-gl.o \
+OBJS           = xscreensaver-gl-helper.o normals.o fps-gl.o \
                  atlantis.o b_draw.o b_lockglue.o b_sphere.o bubble3d.o \
                  buildlwo.o cage.o dolphin.o gears.o lament.o lament_model.o \
                  moebius.o morph3d.o pipeobjs.o pipes.o rubik.o s1_1.o s1_2.o \
@@ -130,7 +137,7 @@ OBJS                = xscreensaver-gl-helper.o normals.o glxfonts.o fps-gl.o \
                  gflux.o stonerview.o stonerview-move.o stonerview-osc.o \
                  stonerview-view.o starwars.o glut_stroke.o glut_swidth.o \
                  gltext.o molecule.o dangerball.o sphere.o tube.o circuit.o \
-                 menger.o engine.o flipscreen3d.o font-ximage.o dnalogo.o \
+                 menger.o engine.o flipscreen3d.o dnalogo.o \
                  grab-ximage.o glsnake.o boxed.o glforestfire.o sballs.o \
                  cubenetic.o spheremonics.o marching.o lavalite.o rotator.o \
                  trackball.o gltrackball.o queens.o endgame.o chessmodels.o \
@@ -155,8 +162,9 @@ OBJS                = xscreensaver-gl-helper.o normals.o glxfonts.o fps-gl.o \
                  hilbert.o companion.o companion_quad.o companion_disc.o \
                  companion_heart.o tronbit.o tronbit_idle1.o tronbit_idle2.o \
                  tronbit_no.o tronbit_yes.o jwzgles.o kaleidocycle.o \
-                 quasicrystal.o unknownpleasures.o geodesic.o \
-                 projectiveplane.o winduprobot.o robot.o robot-wireframe.o
+                 quasicrystal.o unknownpleasures.o geodesic.o geodesicgears.o \
+                 projectiveplane.o winduprobot.o robot.o robot-wireframe.o \
+                 cityflow.o
 
 GL_EXES                = cage gears moebius pipes sproingies stairs superquadrics \
                  morph3d rubik atlantis lament bubble3d glplanet pulsar \
@@ -173,7 +181,7 @@ GL_EXES             = cage gears moebius pipes sproingies stairs superquadrics \
                  lockward cubicgrid hypnowheel skytentacles jigsaw photopile \
                  rubikblocks surfaces hilbert companioncube tronbit \
                  kaleidocycle quasicrystal unknownpleasures geodesic \
-                 projectiveplane winduprobot
+                 geodesicgears projectiveplane winduprobot cityflow
 GLE_EXES       = extrusion
 SUID_EXES      = sonar
 GL_UTIL_EXES   = xscreensaver-gl-helper
@@ -182,25 +190,29 @@ HACK_EXES_1       = @GL_EXES@ @GLE_EXES@
 HACK_EXES      = $(HACK_EXES_1) @SUID_EXES@
 XSHM_OBJS      = $(UTILS_BIN)/xshm.o
 GRAB_OBJS      = $(UTILS_BIN)/grabclient.o grab-ximage.o $(XSHM_OBJS)
+ANIM_OBJS      = recanim-gl.o
+ANIM_LIBS      = @XPM_LIBS@
 EXES           = @GL_UTIL_EXES@ $(HACK_EXES)
 
 RETIRED_EXES   = @RETIRED_GL_EXES@
 RETIRED_GL_EXES        = glforestfire
 
-FPS_OBJS       = glxfonts.o texfont.o $(HACK_BIN)/fps.o fps-gl.o
-HACK_OBJS      = $(JWZGLES_OBJS) $(HACK_BIN)/screenhack.o \
+FPS_OBJS       = texfont.o $(HACK_BIN)/fps.o fps-gl.o @XFT_OBJS@
+HACK_OBJS      = $(JWZGLES_OBJS) $(HACK_BIN)/screenhack.o @ANIM_OBJS@ \
                  xlockmore-gl.o xlock-gl-utils.o ${FPS_OBJS} \
                  $(UTILS_BIN)/resources.o $(UTILS_BIN)/visual.o \
                  $(UTILS_BIN)/visual-gl.o $(UTILS_BIN)/usleep.o \
                  $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/hsv.o \
-                 $(UTILS_BIN)/colors.o
+                 $(UTILS_BIN)/colors.o $(UTILS_BIN)/async_netdb.o \
+                 $(UTILS_BIN)/aligned_malloc.o $(UTILS_BIN)/thread_util.o \
+                 $(UTILS_BIN)/utf8wc.o
 
 HDRS           = atlantis.h bubble3d.h buildlwo.h e_textures.h xpm-ximage.h \
-                 grab-ximage.h font-ximage.h tube.h sphere.h boxed.h \
+                 grab-ximage.h tube.h sphere.h boxed.h \
                  stonerview.h stonerview-move.h stonerview-osc.h \
                  glutstroke.h glut_roman.h marching.h rotator.h trackball.h \
                  gltrackball.h chessmodels.h chessgames.h gllist.h flurry.h \
-                 tunnel_draw.h ants.h polyhedra.h normals.h glxfonts.h \
+                 tunnel_draw.h ants.h polyhedra.h normals.h \
                  texfont.h tangram_shapes.h sproingies.h extrusion.h \
                  glschool.h glschool_gl.h glschool_alg.h topblock.h \
                  involute.h teapot.h sonar.h dropshadow.h starwars.h \
@@ -228,7 +240,8 @@ GL_MEN              = atlantis.man boxed.man bubble3d.man cage.man circuit.man \
                  photopile.man rubikblocks.man surfaces.man hilbert.man \
                  companioncube.man tronbit.man kaleidocycle.man \
                  quasicrystal.man unknownpleasures.man geodesic.man \
-                 projectiveplane.man winduprobot.man
+                 geodesicgears.man projectiveplane.man winduprobot.man \
+                 cityflow.man
 MEN            = @GL_MEN@
 RETIRED_MEN    = glforestfire.man
 EXTRAS         = README Makefile.in dxf2gl.pl vrml2gl.pl wfront2gl.pl \
@@ -461,10 +474,19 @@ $(UTILS_BIN)/hsv.o:               $(UTILS_SRC)/hsv.c
 $(UTILS_BIN)/resources.o:      $(UTILS_SRC)/resources.c
 $(UTILS_BIN)/usleep.o:         $(UTILS_SRC)/usleep.c
 $(UTILS_BIN)/visual.o:         $(UTILS_SRC)/visual.c
+$(UTILS_BIN)/xmu.o:            $(UTILS_SRC)/xmu.c
+$(UTILS_BIN)/xft.o:            $(UTILS_SRC)/xft.c
+$(UTILS_BIN)/utf8wc.o:         $(UTILS_SRC)/utf8wc.c
+$(UTILS_BIN)/logo.o:           $(UTILS_SRC)/logo.c
+$(UTILS_BIN)/minixpm.o:                $(UTILS_SRC)/minixpm.c
 $(UTILS_BIN)/visual-gl.o:      $(UTILS_SRC)/visual-gl.c
 $(UTILS_BIN)/yarandom.o:       $(UTILS_SRC)/yarandom.c
 $(UTILS_BIN)/xshm.o:           $(UTILS_SRC)/xshm.c
 $(UTILS_BIN)/textclient.o:     $(UTILS_SRC)/textclient.c
+$(UTILS_BIN)/async_netdb.o:    $(UTILS_SRC)/async_netdb.c
+$(UTILS_BIN)/aligned_malloc.o: $(UTILS_SRC)/aligned_malloc.c
+$(UTILS_BIN)/thread_util.o:    $(UTILS_SRC)/thread_util.c
+$(UTILS_BIN)/spline.o:         $(UTILS_SRC)/spline.c
 $(HACK_BIN)/screenhack.o:      $(HACK_SRC)/screenhack.c
 $(HACK_BIN)/xlockmore.o:       $(HACK_SRC)/xlockmore.c
 $(HACK_BIN)/fps.o:             $(HACK_SRC)/fps.c
@@ -495,6 +517,8 @@ xscreensaver-gl-helper: $(HELPER_OBJS)
 XLM_CFLAGS=-DUSE_GL $(INCLUDES) $(DEFS) $(CPPFLAGS) $(CFLAGS) $(X_CFLAGS)
 xlockmore-gl.o: $(HACK_SRC)/xlockmore.c
        $(CC) -o $@ -c $(XLM_CFLAGS) $(HACK_SRC)/xlockmore.c
+recanim-gl.o: $(HACK_SRC)/recanim.c
+       $(CC) -o $@ -c $(XLM_CFLAGS) $(HACK_SRC)/recanim.c
 
 CC_HACK                = $(CC) $(LDFLAGS)
 
@@ -521,7 +545,8 @@ FLURRY_OBJS = $(FLURRY_OBJS_1) $(HACK_OBJS)
 flurry:                flurry.o        $(FLURRY_OBJS)
        $(CC_HACK) -o $@ $@.o   $(FLURRY_OBJS) $(HACK_LIBS) -lm
 
-GEARS_OBJS=normals.o involute.o $(HACK_TRACK_OBJS)
+GEARS_OBJS_1=normals.o involute.o
+GEARS_OBJS=$(GEARS_OBJS_1) $(HACK_TRACK_OBJS)
 gears:         gears.o         tube.o $(GEARS_OBJS)
        $(CC_HACK) -o $@ $@.o   tube.o $(GEARS_OBJS) $(HACK_LIBS)
 
@@ -596,8 +621,8 @@ DB_OBJS=sphere.o tube.o $(HACK_TRACK_OBJS)
 dangerball:    dangerball.o    $(DB_OBJS)
        $(CC_HACK) -o $@ $@.o   $(DB_OBJS) $(HACK_LIBS)
 
-circuit:       circuit.o       font-ximage.o $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   font-ximage.o $(HACK_OBJS) $(HACK_LIBS)
+circuit:       circuit.o       $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
 
 menger:                menger.o        $(HACK_TRACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
@@ -672,9 +697,8 @@ bouncingcow:                        $(COW_OBJS)
        $(CC_HACK) -o $@        $(COW_OBJS) $(XPM_LIBS)
 
 ROBO_OBJS=\
-  robot.o robot-wireframe.o \
-  gllist.o xpm-ximage.o normals.o involute.o sphere.o \
-  winduprobot.o $(TEXT) $(HACK_TRACK_OBJS)
+  robot.o robot-wireframe.o gllist.o xpm-ximage.o sphere.o \
+  winduprobot.o $(GEARS_OBJS_1) $(TEXT) $(HACK_TRACK_OBJS)
 winduprobot:                   $(ROBO_OBJS)
        $(CC_HACK) -o $@        $(ROBO_OBJS) $(XPM_LIBS) $(TEXT_LIBS)
 
@@ -869,6 +893,12 @@ unknownpleasures: unknownpleasures.o       $(HACK_TRACK_OBJS)
 geodesic: geodesic.o            normals.o $(HACK_TRACK_OBJS)
        $(CC_HACK) -o $@ $@.o    normals.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
+geodesicgears: geodesicgears.o  $(GEARS_OBJS)
+       $(CC_HACK) -o $@ $@.o    $(GEARS_OBJS) $(HACK_LIBS)
+
+cityflow:      cityflow.o      $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
 ##############################################################################
 #
 # DO NOT DELETE: updated by make distdepend
@@ -1162,11 +1192,11 @@ chessmodels.o: ../../config.h
 chessmodels.o: $(srcdir)/jwzglesI.h
 chessmodels.o: $(srcdir)/jwzgles.h
 circuit.o: ../../config.h
-circuit.o: $(srcdir)/font-ximage.h
 circuit.o: $(HACK_SRC)/fps.h
 circuit.o: $(srcdir)/jwzglesI.h
 circuit.o: $(srcdir)/jwzgles.h
 circuit.o: $(HACK_SRC)/screenhackI.h
+circuit.o: $(srcdir)/texfont.h
 circuit.o: $(UTILS_SRC)/colors.h
 circuit.o: $(UTILS_SRC)/grabscreen.h
 circuit.o: $(UTILS_SRC)/hsv.h
@@ -1177,6 +1207,22 @@ circuit.o: $(UTILS_SRC)/xshm.h
 circuit.o: $(UTILS_SRC)/yarandom.h
 circuit.o: $(HACK_SRC)/xlockmoreI.h
 circuit.o: $(HACK_SRC)/xlockmore.h
+cityflow.o: ../../config.h
+cityflow.o: $(HACK_SRC)/fps.h
+cityflow.o: $(srcdir)/gltrackball.h
+cityflow.o: $(srcdir)/jwzglesI.h
+cityflow.o: $(srcdir)/jwzgles.h
+cityflow.o: $(HACK_SRC)/screenhackI.h
+cityflow.o: $(UTILS_SRC)/colors.h
+cityflow.o: $(UTILS_SRC)/grabscreen.h
+cityflow.o: $(UTILS_SRC)/hsv.h
+cityflow.o: $(UTILS_SRC)/resources.h
+cityflow.o: $(UTILS_SRC)/usleep.h
+cityflow.o: $(UTILS_SRC)/visual.h
+cityflow.o: $(UTILS_SRC)/xshm.h
+cityflow.o: $(UTILS_SRC)/yarandom.h
+cityflow.o: $(HACK_SRC)/xlockmoreI.h
+cityflow.o: $(HACK_SRC)/xlockmore.h
 companion_disc.o: ../../config.h
 companion_disc.o: $(srcdir)/gllist.h
 companion_disc.o: $(srcdir)/jwzglesI.h
@@ -1391,7 +1437,6 @@ endgame.o: $(HACK_SRC)/xlockmore.h
 engine.o: ../../config.h
 engine.o: $(HACK_SRC)/fps.h
 engine.o: $(srcdir)/gltrackball.h
-engine.o: $(srcdir)/glxfonts.h
 engine.o: $(srcdir)/jwzglesI.h
 engine.o: $(srcdir)/jwzgles.h
 engine.o: $(srcdir)/rotator.h
@@ -1571,14 +1616,9 @@ flyingtoasters.o: $(UTILS_SRC)/yarandom.h
 flyingtoasters.o: $(HACK_SRC)/xlockmoreI.h
 flyingtoasters.o: $(HACK_SRC)/xlockmore.h
 flyingtoasters.o: $(srcdir)/xpm-ximage.h
-font-ximage.o: ../../config.h
-font-ximage.o: $(srcdir)/font-ximage.h
-font-ximage.o: $(srcdir)/jwzglesI.h
-font-ximage.o: $(srcdir)/jwzgles.h
 fps-gl.o: ../../config.h
 fps-gl.o: $(HACK_SRC)/fpsI.h
 fps-gl.o: $(HACK_SRC)/fps.h
-fps-gl.o: $(srcdir)/glxfonts.h
 fps-gl.o: $(srcdir)/jwzglesI.h
 fps-gl.o: $(srcdir)/jwzgles.h
 fps-gl.o: $(HACK_SRC)/screenhackI.h
@@ -1612,6 +1652,27 @@ gears.o: $(UTILS_SRC)/xshm.h
 gears.o: $(UTILS_SRC)/yarandom.h
 gears.o: $(HACK_SRC)/xlockmoreI.h
 gears.o: $(HACK_SRC)/xlockmore.h
+geodesicgears.o: ../../config.h
+geodesicgears.o: $(HACK_SRC)/fps.h
+geodesicgears.o: $(srcdir)/gllist.h
+geodesicgears.o: $(srcdir)/gltrackball.h
+geodesicgears.o: $(srcdir)/involute.h
+geodesicgears.o: $(srcdir)/jwzglesI.h
+geodesicgears.o: $(srcdir)/jwzgles.h
+geodesicgears.o: $(srcdir)/normals.h
+geodesicgears.o: $(srcdir)/rotator.h
+geodesicgears.o: $(HACK_SRC)/screenhackI.h
+geodesicgears.o: $(srcdir)/texfont.h
+geodesicgears.o: $(UTILS_SRC)/colors.h
+geodesicgears.o: $(UTILS_SRC)/grabscreen.h
+geodesicgears.o: $(UTILS_SRC)/hsv.h
+geodesicgears.o: $(UTILS_SRC)/resources.h
+geodesicgears.o: $(UTILS_SRC)/usleep.h
+geodesicgears.o: $(UTILS_SRC)/visual.h
+geodesicgears.o: $(UTILS_SRC)/xshm.h
+geodesicgears.o: $(UTILS_SRC)/yarandom.h
+geodesicgears.o: $(HACK_SRC)/xlockmoreI.h
+geodesicgears.o: $(HACK_SRC)/xlockmore.h
 geodesic.o: ../../config.h
 geodesic.o: $(HACK_SRC)/fps.h
 geodesic.o: $(srcdir)/gllist.h
@@ -1774,6 +1835,7 @@ glmatrix.o: $(srcdir)/xpm-ximage.h
 glplanet.o: ../../config.h
 glplanet.o: $(HACK_SRC)/fps.h
 glplanet.o: $(srcdir)/gltrackball.h
+glplanet.o: $(HACK_SRC)/images/earth_night.xpm
 glplanet.o: $(HACK_SRC)/images/earth.xpm
 glplanet.o: $(srcdir)/jwzglesI.h
 glplanet.o: $(srcdir)/jwzgles.h
@@ -1821,7 +1883,6 @@ glschool.o: $(HACK_SRC)/xlockmoreI.h
 glschool.o: $(HACK_SRC)/xlockmore.h
 glslideshow.o: ../../config.h
 glslideshow.o: $(HACK_SRC)/fps.h
-glslideshow.o: $(srcdir)/glxfonts.h
 glslideshow.o: $(srcdir)/grab-ximage.h
 glslideshow.o: $(srcdir)/jwzglesI.h
 glslideshow.o: $(srcdir)/jwzgles.h
@@ -1839,7 +1900,6 @@ glslideshow.o: $(HACK_SRC)/xlockmoreI.h
 glslideshow.o: $(HACK_SRC)/xlockmore.h
 glsnake.o: ../../config.h
 glsnake.o: $(HACK_SRC)/fps.h
-glsnake.o: $(srcdir)/glxfonts.h
 glsnake.o: $(srcdir)/jwzglesI.h
 glsnake.o: $(srcdir)/jwzgles.h
 glsnake.o: $(HACK_SRC)/screenhackI.h
@@ -1871,6 +1931,7 @@ gltext.o: $(UTILS_SRC)/hsv.h
 gltext.o: $(UTILS_SRC)/resources.h
 gltext.o: $(UTILS_SRC)/textclient.h
 gltext.o: $(UTILS_SRC)/usleep.h
+gltext.o: $(UTILS_SRC)/utf8wc.h
 gltext.o: $(UTILS_SRC)/visual.h
 gltext.o: $(UTILS_SRC)/xshm.h
 gltext.o: $(UTILS_SRC)/yarandom.h
@@ -1889,13 +1950,6 @@ glut_swidth.o: ../../config.h
 glut_swidth.o: $(srcdir)/glutstroke.h
 glut_swidth.o: $(srcdir)/jwzglesI.h
 glut_swidth.o: $(srcdir)/jwzgles.h
-glxfonts.o: ../../config.h
-glxfonts.o: $(HACK_SRC)/fps.h
-glxfonts.o: $(srcdir)/glxfonts.h
-glxfonts.o: $(srcdir)/jwzglesI.h
-glxfonts.o: $(srcdir)/jwzgles.h
-glxfonts.o: $(srcdir)/texfont.h
-glxfonts.o: $(UTILS_SRC)/resources.h
 grab-ximage.o: ../../config.h
 grab-ximage.o: $(srcdir)/grab-ximage.h
 grab-ximage.o: $(srcdir)/jwzglesI.h
@@ -2011,7 +2065,6 @@ jigsaw.o: $(HACK_SRC)/xlockmore.h
 juggler3d.o: ../../config.h
 juggler3d.o: $(HACK_SRC)/fps.h
 juggler3d.o: $(srcdir)/gltrackball.h
-juggler3d.o: $(srcdir)/glxfonts.h
 juggler3d.o: $(srcdir)/jwzglesI.h
 juggler3d.o: $(srcdir)/jwzgles.h
 juggler3d.o: $(srcdir)/rotator.h
@@ -2204,7 +2257,6 @@ moebius.o: $(HACK_SRC)/xlockmore.h
 molecule.o: ../../config.h
 molecule.o: $(HACK_SRC)/fps.h
 molecule.o: $(srcdir)/gltrackball.h
-molecule.o: $(srcdir)/glxfonts.h
 molecule.o: $(srcdir)/jwzglesI.h
 molecule.o: $(srcdir)/jwzgles.h
 molecule.o: molecules.h
@@ -2278,7 +2330,6 @@ photopile.o: $(HACK_SRC)/xlockmore.h
 pinion.o: ../../config.h
 pinion.o: $(HACK_SRC)/fps.h
 pinion.o: $(srcdir)/gltrackball.h
-pinion.o: $(srcdir)/glxfonts.h
 pinion.o: $(srcdir)/involute.h
 pinion.o: $(srcdir)/jwzglesI.h
 pinion.o: $(srcdir)/jwzgles.h
@@ -2321,7 +2372,6 @@ pipes.o: $(HACK_SRC)/xlockmore.h
 polyhedra-gl.o: ../../config.h
 polyhedra-gl.o: $(HACK_SRC)/fps.h
 polyhedra-gl.o: $(srcdir)/gltrackball.h
-polyhedra-gl.o: $(srcdir)/glxfonts.h
 polyhedra-gl.o: $(srcdir)/jwzglesI.h
 polyhedra-gl.o: $(srcdir)/jwzgles.h
 polyhedra-gl.o: $(srcdir)/normals.h
@@ -2601,10 +2651,12 @@ sonar.o: $(srcdir)/rotator.h
 sonar.o: $(HACK_SRC)/screenhackI.h
 sonar.o: $(srcdir)/sonar.h
 sonar.o: $(srcdir)/texfont.h
+sonar.o: $(UTILS_SRC)/aligned_malloc.h
 sonar.o: $(UTILS_SRC)/colors.h
 sonar.o: $(UTILS_SRC)/grabscreen.h
 sonar.o: $(UTILS_SRC)/hsv.h
 sonar.o: $(UTILS_SRC)/resources.h
+sonar.o: $(UTILS_SRC)/thread_util.h
 sonar.o: $(UTILS_SRC)/usleep.h
 sonar.o: $(UTILS_SRC)/visual.h
 sonar.o: $(UTILS_SRC)/xshm.h
@@ -2625,7 +2677,6 @@ sonar-sim.o: $(UTILS_SRC)/yarandom.h
 spheremonics.o: ../../config.h
 spheremonics.o: $(HACK_SRC)/fps.h
 spheremonics.o: $(srcdir)/gltrackball.h
-spheremonics.o: $(srcdir)/glxfonts.h
 spheremonics.o: $(srcdir)/jwzglesI.h
 spheremonics.o: $(srcdir)/jwzgles.h
 spheremonics.o: $(srcdir)/normals.h
@@ -2712,14 +2763,13 @@ starwars.o: $(UTILS_SRC)/hsv.h
 starwars.o: $(UTILS_SRC)/resources.h
 starwars.o: $(UTILS_SRC)/textclient.h
 starwars.o: $(UTILS_SRC)/usleep.h
+starwars.o: $(UTILS_SRC)/utf8wc.h
 starwars.o: $(UTILS_SRC)/visual.h
 starwars.o: $(UTILS_SRC)/xshm.h
 starwars.o: $(UTILS_SRC)/yarandom.h
 starwars.o: $(HACK_SRC)/xlockmoreI.h
 starwars.o: $(HACK_SRC)/xlockmore.h
 stonerview-move.o: ../../config.h
-stonerview-move.o: $(srcdir)/jwzglesI.h
-stonerview-move.o: $(srcdir)/jwzgles.h
 stonerview-move.o: $(srcdir)/stonerview.h
 stonerview-move.o: $(srcdir)/stonerview-move.h
 stonerview-move.o: $(srcdir)/stonerview-osc.h
@@ -2744,8 +2794,6 @@ stonerview.o: $(UTILS_SRC)/yarandom.h
 stonerview.o: $(HACK_SRC)/xlockmoreI.h
 stonerview.o: $(HACK_SRC)/xlockmore.h
 stonerview-osc.o: ../../config.h
-stonerview-osc.o: $(srcdir)/jwzglesI.h
-stonerview-osc.o: $(srcdir)/jwzgles.h
 stonerview-osc.o: $(srcdir)/stonerview.h
 stonerview-osc.o: $(srcdir)/stonerview-move.h
 stonerview-osc.o: $(srcdir)/stonerview-osc.h
@@ -2805,7 +2853,6 @@ swim.o: $(UTILS_SRC)/yarandom.h
 swim.o: $(HACK_SRC)/xlockmoreI.h
 tangram.o: ../../config.h
 tangram.o: $(HACK_SRC)/fps.h
-tangram.o: $(srcdir)/glxfonts.h
 tangram.o: $(srcdir)/jwzglesI.h
 tangram.o: $(srcdir)/jwzgles.h
 tangram.o: $(HACK_SRC)/screenhackI.h
@@ -2832,10 +2879,13 @@ teapot.o: $(srcdir)/normals.h
 teapot.o: $(srcdir)/teapot2.h
 teapot.o: $(srcdir)/teapot.h
 texfont.o: ../../config.h
+texfont.o: $(HACK_SRC)/fps.h
 texfont.o: $(srcdir)/jwzglesI.h
 texfont.o: $(srcdir)/jwzgles.h
 texfont.o: $(srcdir)/texfont.h
 texfont.o: $(UTILS_SRC)/resources.h
+texfont.o: $(UTILS_SRC)/xft.h
+texfont.o: $(UTILS_SRC)/xshm.h
 timetunnel.o: ../../config.h
 timetunnel.o: $(HACK_SRC)/fps.h
 timetunnel.o: $(srcdir)/gltrackball.h
@@ -3022,7 +3072,6 @@ winduprobot.o: ../../config.h
 winduprobot.o: $(HACK_SRC)/fps.h
 winduprobot.o: $(srcdir)/gllist.h
 winduprobot.o: $(srcdir)/gltrackball.h
-winduprobot.o: $(srcdir)/glxfonts.h
 winduprobot.o: $(srcdir)/involute.h
 winduprobot.o: $(srcdir)/jwzglesI.h
 winduprobot.o: $(srcdir)/jwzgles.h
@@ -3043,7 +3092,6 @@ winduprobot.o: $(HACK_SRC)/xlockmore.h
 winduprobot.o: $(srcdir)/xpm-ximage.h
 xlock-gl-utils.o: ../../config.h
 xlock-gl-utils.o: $(HACK_SRC)/fps.h
-xlock-gl-utils.o: $(srcdir)/glxfonts.h
 xlock-gl-utils.o: $(srcdir)/jwzglesI.h
 xlock-gl-utils.o: $(srcdir)/jwzgles.h
 xlock-gl-utils.o: $(HACK_SRC)/screenhackI.h
index cf2f51c8f1a567cf40775c82298459b38e071468..011df41a077657b9b5c8b3c27e560fde8cefd228 100644 (file)
@@ -12,7 +12,7 @@
  * Created: 21-Feb-2005
  */
 
-#define DEF_FONT "-*-helvetica-bold-r-normal-*-240-*"
+#define DEF_FONT "-*-helvetica-bold-r-normal-*-*-240-*-*-*-*-*-*"
 #define DEFAULTS  "*count:           7         \n" \
                  "*delay:           10000     \n" \
                  "*wireframe:       False     \n" \
index e3580eeb93f706fff4fa9af00b6fcd63330c68c7..9cce87d5e530e2527b719e87d12d5f6867176aa8 100644 (file)
@@ -31,7 +31,8 @@
 
 #ifdef STANDALONE
 #define DEFAULTS        "*delay:   20000 \n" \
-                        "*showFPS: False \n"
+                        "*showFPS: False \n" \
+               "*componentFont: -*-courier-bold-r-normal-*-*-140-*-*-*-*-*-*"
 
 # define refresh_circuit 0
 # define circuit_handle_event 0
 
 #ifdef USE_GL
 
-#include "font-ximage.h"
+#include "texfont.h"
 
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
 static int maxparts;
-static char *font;
 static int rotatespeed;
 static int spin;
 static int uselight;
@@ -70,7 +70,6 @@ static int seven;
 
 static XrmOptionDescRec opts[] = {
   {"-parts", ".circuit.parts", XrmoptionSepArg, 0 },
-  {"-font", ".circuit.font", XrmoptionSepArg, 0 },
   {"-rotate-speed", ".circuit.rotatespeed", XrmoptionSepArg, 0 },
   {"+spin", ".circuit.spin", XrmoptionNoArg, "false" },
   {"-spin", ".circuit.spin", XrmoptionNoArg, "true" },
@@ -82,7 +81,6 @@ static XrmOptionDescRec opts[] = {
 
 static argtype vars[] = {
   {&maxparts, "parts", "Parts", DEF_PARTS, t_Int},
-  {&font, "font", "Font", "fixed", t_String},
   {&rotatespeed, "rotatespeed", "Rotatespeed", DEF_ROTATESPEED, t_Int},
   {&spin, "spin", "Spin", DEF_SPIN, t_Bool},
   {&uselight, "light", "Light", DEF_LIGHT, t_Bool},
@@ -110,13 +108,6 @@ static float f_rand(void)
 
 #define RAND_RANGE(min, max) ((min) + (max - min) * f_rand())
 
-/* used for allocating font textures */
-typedef struct {
-  int num; /* index number */
-  int w;   /* width */
-  int h;   /* height */
-} TexNum;
-
 /* Represents a band on a resistor/diode/etc */
 typedef struct {
   float pos;     /* relative position from start/previous band */
@@ -177,8 +168,7 @@ static const char * const smctypes[] = {
 
 typedef struct {
   int type; /* package type. 0 = to-92, 1 = to-220 */
-  GLfloat tw, th; /* texture dimensions */
-  GLuint tnum; /* texture binding */
+  const char *text;
 } Transistor;
 
 typedef struct {
@@ -252,8 +242,7 @@ static const ICTypes ictypes[] = {
 typedef struct {
   int type; /* 0 = DIL, 1 = flat square */
   int pins; 
-  float tw, th; /* texture dimensions for markings */
-  int tnum; /* texture number */
+  char text[100];
 } IC;
 
 /* 7 segment display */
@@ -345,6 +334,7 @@ typedef struct {
   int display_i;
   GLfloat rotate_angle;
 
+  texture_font_data *font;
   char *font_strings[50]; /* max of 40 textures */
   int font_w[50], font_h[50];
   int font_init;
@@ -371,13 +361,11 @@ static int DrawRCA(Circuit *, RCA *);
 static int DrawThreeFive(Circuit *, ThreeFive *);
 static int DrawSwitch(Circuit *, Switch *);
 
-static void freetexture(Circuit *, GLuint);
 static void reorder(Component *[]);
 static int circle(Circuit *, float, int,int);
 static int bandedCylinder(Circuit *, 
                            float, float , GLfloat, GLfloat , GLfloat,  
                            Band **, int);
-static TexNum *fonttexturealloc(ModeInfo *, const char *, float *, float *);
 static int Rect(GLfloat , GLfloat , GLfloat, GLfloat , GLfloat ,GLfloat);
 static int ICLeg(GLfloat, GLfloat, GLfloat, int);
 static int HoledRectangle(Circuit *ci, 
@@ -531,40 +519,6 @@ static int wire(Circuit *ci, float len)
   return polys;
 }
 
-#if 0
-static int ring(GLfloat inner, GLfloat outer, int nsegs)
-{
-  int polys = 0;
-  GLfloat z1, z2, y1, y2;
-  GLfloat Z1, Z2, Y1, Y2;
-  int i;
-
-  z1 = inner; y1 = 0;
-  Z1 = outer; Y1 = 0;
-  glBegin(GL_QUADS);
-  glNormal3f(1, 0, 0);
-  for(i=0; i <=360 ; i+= 360/nsegs)
-  {
-    float angle=i;
-    z2=inner*(float)ci->sin_table[(int)angle];
-    y2=inner*(float)ci->cos_table[(int)angle];
-    Z2=outer*(float)ci->sin_table[(int)angle];
-    Y2=outer*(float)ci->cos_table[(int)angle];
-    glVertex3f(0, Y1, Z1);
-    glVertex3f(0, y1, z1);
-    glVertex3f(0, y2, z2);
-    glVertex3f(0, Y2, Z2);
-    polys++;
-    z1=z2;
-    y1=y2;
-    Z1=Z2;
-    Y1=Y2;
-  }
-  glEnd();
-  return polys;
-}
-#endif
-
 static int sphere(Circuit *ci, GLfloat r, float stacks, float slices,
              int startstack, int endstack, int startslice,
              int endslice)
@@ -673,14 +627,6 @@ static int DrawComponent(Circuit *ci, Component *c, unsigned long *polysP)
           glDisable(GL_LIGHT1);
           ci->light = 0; ci->lighton = 0;
         }
-       if (c->type == 5) {
-          if (((IC *)c->c)->tnum)
-            freetexture(ci, ((IC *)c->c)->tnum);
-       }
-       if (c->type == 2) {
-          if (((Transistor *)c->c)->tnum)
-            freetexture(ci, ((Transistor *)c->c)->tnum);
-       }
         if (c->type == 1)
           free(((Diode *)c->c)->band); /* remember to free diode band */
         free(c->c);
@@ -1091,7 +1037,7 @@ static int DrawIC(Circuit *ci, IC *c)
   GLfloat lspec[] = {0.6, 0.6, 0.6, 0};
   GLfloat lcol[] = {0.4, 0.4, 0.4, 0};
   GLfloat lshine = 40;
-  float mult, th, size;
+  float th, size;
 
   glPushMatrix();
   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, col);
@@ -1155,7 +1101,6 @@ static int DrawIC(Circuit *ci, IC *c)
       polys++;
     glEnd();
     glDisable(GL_POLYGON_OFFSET_FILL);
-    if (c->tnum) glBindTexture(GL_TEXTURE_2D, c->tnum);
     glEnable(GL_TEXTURE_2D);
     glEnable(GL_BLEND);
     if (c->pins == 8)
@@ -1163,20 +1108,23 @@ static int DrawIC(Circuit *ci, IC *c)
     else
       size = 0.6;
     th = size*2/3;
-    mult = size*c->tw / c->th;
-    mult /= 2;
-    glBegin(GL_QUADS); /* text markings */
-     glNormal3f(0, 0, 1);
-     glTexCoord2f(0, 1);
-     glVertex3f(th, mult, 0.1);
-     glTexCoord2f(1, 1);
-     glVertex3f(th, -mult, 0.1);
-     glTexCoord2f(1, 0);
-     glVertex3f(-th, -mult, 0.1);
-     glTexCoord2f(0, 0);
-     glVertex3f(-th, mult, 0.1);
-      polys++;
-    glEnd();
+
+    {
+      GLfloat texfg[] = {0.7, 0.7, 0.7, 1.0};
+      GLfloat s = 0.015;
+      int w, h;
+      w = texture_string_width (ci->font, c->text, &h);
+
+      glPushMatrix();
+      glTranslatef (0, 0, 0.1);
+      glRotatef (90, 0, 0, 1);
+      glScalef (s, s, s);
+      glTranslatef (-w/2, 0, 0);
+      glColor4fv (texfg);
+      print_texture_string (ci->font, c->text);
+      glPopMatrix();
+    }
+
     glDisable(GL_TEXTURE_2D);
     glDisable(GL_BLEND);
     d = (h*2-0.1) / c->pins;
@@ -1394,32 +1342,29 @@ static int DrawTransistor(Circuit *ci, Transistor *t)
   glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, col);
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   if (t->type == 1) { /* TO-92 style */
-    float mult, y1, y2;
-    mult = 1.5*t->th/t->tw;
-    y1 = 0.2+mult/2;
-    y2 = 0.8-mult/2;
     glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, col);
     glRotatef(90, 0, 1, 0);
     glRotatef(90, 0, 0, 1);
     polys += createCylinder(ci, 1.0, 0.4, 1, 1);
     polys += Rect(0, -0.2, 0.4, 1, 0.2, 0.8);
 /* Draw the markings */
-    glEnable(GL_TEXTURE_2D);
-    if (t->tnum) glBindTexture(GL_TEXTURE_2D, t->tnum);
-    glEnable(GL_BLEND);
-    glDepthMask(GL_FALSE);
-    glBegin (GL_QUADS);
-     glNormal3f(0, 0, 1);
-     glTexCoord2f(0, 1);
-     glVertex3f(y1, -0.21, 0.3);
-     glTexCoord2f(1, 1);
-     glVertex3f(y1, -0.21, -0.3);
-     glTexCoord2f(1, 0);
-     glVertex3f(y2, -0.21, -0.3);
-     glTexCoord2f(0, 0);
-     glVertex3f(y2, -0.21, 0.3);
-     polys++;
-    glEnd();
+
+    {
+      GLfloat texfg[] = {0.7, 0.7, 0.7, 1.0};
+      GLfloat s = 0.015;
+      int w, h;
+      w = texture_string_width (ci->font, t->text, &h);
+
+      glPushMatrix();
+      glRotatef (90, 1, 0, 0);
+      glTranslatef (0.5, -0.05, 0.21);
+      glScalef (s, s, s);
+      glTranslatef (-w/2, 0, 0);
+      glColor4fv (texfg);
+      print_texture_string (ci->font, t->text);
+      glPopMatrix();
+    }
+
     glDisable(GL_TEXTURE_2D);
     glDisable(GL_BLEND);
     glDepthMask(GL_TRUE);
@@ -1430,26 +1375,21 @@ static int DrawTransistor(Circuit *ci, Transistor *t)
     glTranslatef(0, 0, 0.2);
     polys += wire(ci, 2);
   } else if (t->type == 0) { /* TO-220 Style */
-    float mult, y1, y2;
-    mult = 1.5*t->th/t->tw;
-    y1 = 0.75+mult/2;
-    y2 = 0.75-mult/2;
     polys += Rect(0, 0, 0, 1.5, 1.5, 0.5);
-    glEnable(GL_TEXTURE_2D);
-    if (t->tnum) glBindTexture(GL_TEXTURE_2D, t->tnum);
-    glEnable(GL_BLEND);
-    glDepthMask(GL_FALSE);
-    glBegin (GL_QUADS);
-     glNormal3f(0, 0, 1);
-     glTexCoord2f(0, 1);
-     glVertex3f(0, y1, 0.01);
-     glTexCoord2f(1, 1);
-     glVertex3f(1.5, y1, 0.01);
-     glTexCoord2f(1, 0);
-     glVertex3f(1.5, y2, 0.01);
-     glTexCoord2f(0, 0);
-     glVertex3f(0, y2, 0.01);
-    glEnd();
+    {
+      GLfloat texfg[] = {0.7, 0.7, 0.7, 1.0};
+      GLfloat s = 0.015;
+      int w, h;
+      w = texture_string_width (ci->font, t->text, &h);
+
+      glPushMatrix();
+      glTranslatef (0.75, 0.75, 0.01);
+      glScalef (s, s, s);
+      glTranslatef (-w/2, 0, 0);
+      glColor4fv (texfg);
+      print_texture_string (ci->font, t->text);
+      glPopMatrix();
+    }
     glDisable(GL_TEXTURE_2D);
     glDisable(GL_BLEND);
     glDepthMask(GL_TRUE);
@@ -1475,7 +1415,6 @@ static int DrawTransistor(Circuit *ci, Transistor *t)
     polys += Rect(0, 0, 0, 1, 0.5, 0.2);
 /* Draw the markings */
     glEnable(GL_TEXTURE_2D);
-    if (t->tnum) glBindTexture(GL_TEXTURE_2D, t->tnum);
     glEnable(GL_BLEND);
     glDepthMask(GL_FALSE);
     glBegin (GL_QUADS);
@@ -1614,48 +1553,16 @@ static Component * NewComponent(ModeInfo *mi)
 static Transistor *NewTransistor(ModeInfo *mi)
 {
   Transistor *t;
-  float texfg[] = {0.7, 0.7, 0.7, 1.0};
-  float texbg[] = {0.3, 0.3, 0.3, 0.1};
-  TexNum *tn;
-  const char *val;
 
   t = malloc(sizeof(Transistor));
   t->type = (random() % 3);
   if (t->type == 0) {
-    val = transistortypes[random() % countof(transistortypes)];
-    tn = fonttexturealloc(mi, val, texfg, texbg);
-    if (tn == NULL) {
-      fprintf(stderr, "Error getting a texture for a string!\n");
-      t->tnum = 0;
-    } else {
-      t->tnum = tn->num;
-      t->tw = tn->w; t->th = tn->h;
-      free(tn);
-    }
+    t->text = transistortypes[random() % countof(transistortypes)];
   } else if (t->type == 2) {
-    val = smctypes[random() % countof(smctypes)];
-    tn = fonttexturealloc(mi, val, texfg, texbg);
-    if (tn == NULL) {
-      fprintf(stderr, "Error getting a texture for a string!\n");
-      t->tnum = 0;
-    } else {
-      t->tnum = tn->num;
-      t->tw = tn->w; t->th = tn->h;
-      free(tn);
-    }
+    t->text = smctypes[random() % countof(smctypes)];
   } else if (t->type == 1) {
-    val = to92types[random() % countof(to92types)];
-    tn = fonttexturealloc(mi, val, texfg, texbg);
-    if (tn == NULL) {
-      fprintf(stderr, "Error getting a texture for a string!\n");
-      t->tnum = 0;
-    } else {
-      t->tnum = tn->num;
-      t->tw = tn->w; t->th = tn->h;
-      free(tn);
-    }
+    t->text = to92types[random() % countof(to92types)];
   }
-
   return t;
 }
 
@@ -1693,11 +1600,7 @@ static IC *NewIC(ModeInfo *mi)
 {
   IC *c;
   int pins;
-  TexNum *tn;
-  float texfg[] = {0.7, 0.7, 0.7, 1.0};
-  float texbg[] = {0.1, 0.1, 0.1, 0};
   const char *val;
-  char *str;
   int types[countof(ictypes)], i, n = 0;
 
   c = malloc(sizeof(IC));
@@ -1726,18 +1629,8 @@ static IC *NewIC(ModeInfo *mi)
 
   if (n > countof(types)) abort();
   val = ictypes[types[random() % n]].val;
-  str = malloc(strlen(val) + 1 + 4 + 1); /* add space for production date */
-  sprintf(str, "%s\n%02d%02d", val, (int)RAND_RANGE(80, 100), (int)RAND_RANGE(1,53));
-  tn = fonttexturealloc(mi, str, texfg, texbg);
-  free(str);
-  if (tn == NULL) {
-    fprintf(stderr, "Error allocating font texture for '%s'\n", val);
-    c->tnum = 0;
-  } else {
-    c->tw = tn->w; c->th = tn->h;
-    c->tnum = tn->num;
-    free(tn);
-  }
+  sprintf(c->text, "%s\n%02d%02d", val,
+          (int)RAND_RANGE(80, 100), (int)RAND_RANGE(1,53));
   c->pins = pins;
   return c;
 }
@@ -2058,101 +1951,6 @@ static void display(ModeInfo *mi)
   glFlush();
 }
 
-static void freetexture (Circuit *ci, GLuint texture) 
-{
-  ci->s_refs[texture]--;
-  if (ci->s_refs[texture] < 1) {
-    glDeleteTextures(1, &texture);
-  }
-}
-
-static TexNum * fonttexturealloc (ModeInfo *mi,
-                                  const char *str, float *fg, float *bg)
-{
-  Circuit *ci = &circuit[MI_SCREEN(mi)];
-  int i;
-  XImage *ximage;
-  char *c;
-  TexNum *t;
-  GLuint mintex;
-  if (ci->font_init == 0) {
-    for (i = 0 ; i < 50 ; i++) {
-      ci->font_strings[i] = NULL;
-      ci->s_refs[i] = 0;
-      ci->font_w[i] = 0; ci->font_h[i] = 0;
-    }
-    ci->font_init++;
-  }
-  for (i = 0 ; i < 50 ; i++) {
-    if (!ci->s_refs[i] && ci->font_strings[i]) {
-      free (ci->font_strings[i]);
-      ci->font_strings[i] = NULL;
-    }
-    if (ci->font_strings[i] && !strcmp(str, ci->font_strings[i])) { /* if one matches */
-      t = malloc(sizeof(TexNum));
-      t->w = ci->font_w[i]; t->h = ci->font_h[i];
-      t->num = i;
-      ci->s_refs[i]++;
-      return t;
-    }
-  }
-
-  /* at this point we need to make the new texture */
-  ximage = text_to_ximage (mi->xgwa.screen,
-                           mi->xgwa.visual,
-                           font, str,
-                           fg, bg);
-  glGenTextures (1, &mintex);
-  for (i = mintex ; ci->font_strings[i] != NULL ; i++) { /* set i to the next unused value */
-     if (i > 49) {
-        fprintf(stderr, "Texture cache full!\n");
-        free(ximage->data);
-        ximage->data = 0;
-        XFree (ximage);
-        return NULL;
-     }
-  }
-
-  glBindTexture(GL_TEXTURE_2D, i);
-  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-
-  clear_gl_error();
-#if 0
-  i = gluBuild2DMipmaps(GL_TEXTURE_2D, 4,
-                        ximage->width, ximage->height,
-                        GL_RGBA, GL_UNSIGNED_BYTE, ximage->data);
-  if (i)
-    {
-      const char *s = (char *) gluErrorString (i);
-      fprintf (stderr, "%s: error mipmapping %dx%d texture: %s\n",
-               progname, ximage->width, ximage->height,
-               (s ? s : "(unknown)"));
-      abort();
-    }
-  check_gl_error("mipmapping");
-#else
-  glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, ximage->width, ximage->height, 0,
-                GL_RGBA, GL_UNSIGNED_BYTE, ximage->data);
-   check_gl_error("texture");
-#endif
-
-  t = malloc(sizeof(TexNum));
-  t->w = ximage->width;
-  t->h = ximage->height;
-  ci->font_w[i] = t->w; ci->font_h[i] = t->h;
-  free(ximage->data);
-  ximage->data = 0;
-  XFree (ximage);
-  c = malloc(strlen(str)+1);
-  strncpy(c, str, strlen(str)+1);
-  ci->font_strings[i] = c;
-  ci->s_refs[i]++;
-  t->num = i;
-  return t;
-}
-
 /* ensure transparent components are at the end */
 static void reorder(Component *c[])
 {
@@ -2218,7 +2016,7 @@ Circuit *ci;
  ci = &circuit[screen];
  ci->window = MI_WINDOW(mi);
 
- ci->XMAX = ci->YMAX = 30;
+ ci->XMAX = ci->YMAX = 50;
  ci->viewer[2] = 14;
  ci->lightpos[0] = 7;
  ci->lightpos[1] = 7;
@@ -2230,6 +2028,8 @@ Circuit *ci;
  ci->grid_col2[1] = 0.125;
  ci->grid_col2[2] = 0.05;
 
+ ci->font = load_texture_font (MI_DISPLAY(mi), "componentFont");
+
  if (maxparts >= MAX_COMPONENTS)
    maxparts = MAX_COMPONENTS-1;
 
@@ -2271,10 +2071,9 @@ ENTRYPOINT void draw_circuit(ModeInfo *mi)
 
 ENTRYPOINT void release_circuit(ModeInfo *mi)
 {
-  if (circuit != NULL) {
-   (void) free((void *) circuit);
-   circuit = NULL;
-  }
+  Circuit *ci = &circuit[MI_SCREEN(mi)];
+  if (ci->font)
+    free_texture_font (ci->font);
   FreeAllGL(mi);
 }
 
diff --git a/hacks/glx/cityflow.c b/hacks/glx/cityflow.c
new file mode 100644 (file)
index 0000000..acdf322
--- /dev/null
@@ -0,0 +1,544 @@
+/* cityflow, Copyright (c) 2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * 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.
+ */
+
+#define DEFAULTS       "*delay:        20000       \n" \
+                       "*count:        800         \n" \
+                       "*showFPS:      False       \n" \
+                       "*wireframe:    False       \n" \
+
+# define refresh_cube 0
+# define release_cube 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "gltrackball.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+
+#define DEF_SKEW        "12"
+
+#define DEF_WAVES        "6"
+#define DEF_WAVE_SPEED   "25"
+#define DEF_WAVE_RADIUS  "256"
+static int texture_size = 512;
+
+typedef struct {
+  GLfloat x, y, z;
+  GLfloat w, h, d;
+  GLfloat cth, sth;
+} cube;
+
+typedef struct {
+  int x, y;
+  double xth, yth;
+} wave_src;
+
+typedef struct {
+  int nwaves;
+  int radius;
+  int speed;
+  wave_src *srcs;
+  int *heights;
+} waves;
+
+
+typedef struct {
+  GLXContext *glx_context;
+  trackball_state *trackball;
+  Bool button_down_p;
+  GLuint cube_list;
+  int cube_polys;
+  int ncubes;
+  cube *cubes;
+  waves *waves;
+  GLfloat min_x, max_x, min_y, max_y;
+  int texture_width, texture_height;
+  int ncolors;
+  XColor *colors;
+
+} cube_configuration;
+
+static cube_configuration *ccs = NULL;
+
+static int wave_count;
+static int wave_speed;
+static int wave_radius;
+static int skew;
+
+static XrmOptionDescRec opts[] = {
+  {"-waves",       ".waves",      XrmoptionSepArg, 0 },
+  {"-wave-speed",  ".waveSpeed",  XrmoptionSepArg, 0 },
+  {"-wave-radius", ".waveRadius", XrmoptionSepArg, 0 },
+  {"-skew",        ".skew",       XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+  {&wave_count, "waves",     "Waves",      DEF_WAVES, t_Int},
+  {&wave_speed, "waveSpeed", "WaveSpeed",  DEF_WAVE_SPEED, t_Int},
+  {&wave_radius,"waveRadius","WaveRadius", DEF_WAVE_RADIUS,t_Int},
+  {&skew,       "skew",      "Skew",       DEF_SKEW,t_Int},
+};
+
+ENTRYPOINT ModeSpecOpt cube_opts = {
+  countof(opts), opts, countof(vars), vars, NULL};
+
+
+ENTRYPOINT void
+reshape_cube (ModeInfo *mi, int width, int height)
+{
+  GLfloat h = (GLfloat) height / (GLfloat) width;
+
+  glViewport (0, 0, (GLint) width, (GLint) height);
+
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+
+  /* For this one it's really important to minimize the distance between
+     near and far. */
+  gluPerspective (30, 1/h, 10, 50);
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+  gluLookAt( 0.0, 0.0, 30.0,
+             0.0, 0.0, 0.0,
+             0.0, 1.0, 0.0);
+
+  glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+static void
+reset_colors (ModeInfo *mi)
+{
+  cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+  make_smooth_colormap (0, 0, 0,
+                        cc->colors, &cc->ncolors, 
+                        False, 0, False);
+  if (! MI_IS_WIREFRAME(mi))
+    glClearColor (cc->colors[0].red   / 65536.0,
+                  cc->colors[0].green / 65536.0,
+                  cc->colors[0].blue  / 65536.0,
+                  1);
+}
+
+
+static void
+tweak_cubes (ModeInfo *mi)
+{
+  cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+  int i;
+  for (i = 0; i < cc->ncubes; i++)
+    {
+      cube *cube = &cc->cubes[i];
+      cube->x += (frand(2)-1)*0.01;
+      cube->y += (frand(2)-1)*0.01;
+      cube->z += (frand(2)-1)*0.01;
+    }
+}
+
+
+ENTRYPOINT Bool
+cube_handle_event (ModeInfo *mi, XEvent *event)
+{
+  cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+
+  /* Neutralize any vertical motion */
+  GLfloat rot = current_device_rotation();
+  Bool rotp = ((rot >  45 && rot <  135) ||
+               (rot < -45 && rot > -135));
+               
+  if (event->xany.type == ButtonPress ||
+      event->xany.type == ButtonRelease)
+    {
+      if (rotp)
+        event->xbutton.x = MI_WIDTH(mi) / 2;
+      else
+        event->xbutton.y = MI_HEIGHT(mi) / 2;
+    }
+  else if (event->xany.type == MotionNotify)
+    {
+      if (rotp)
+        event->xmotion.x = MI_WIDTH(mi) / 2;
+      else
+        event->xmotion.y = MI_HEIGHT(mi) / 2;
+    }
+
+  if (gltrackball_event_handler (event, cc->trackball,
+                                 MI_WIDTH (mi), MI_HEIGHT (mi),
+                                 &cc->button_down_p))
+    return True;
+  else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+    {
+      reset_colors (mi);
+      tweak_cubes (mi);
+      gltrackball_reset (cc->trackball);
+      return True;
+    }
+
+  return False;
+}
+
+
+/* Waves.
+   Adapted from ../hacks/interference.c by Hannu Mallat.
+ */
+
+static void
+init_wave (ModeInfo *mi)
+{
+  cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+  waves *ww;
+  int i;
+  cc->waves = ww = (waves *) calloc (sizeof(*cc->waves), 1);
+  ww->nwaves = wave_count;
+  ww->radius = wave_radius;
+  ww->speed  = wave_speed;
+  ww->heights = (int *) calloc (sizeof(*ww->heights), ww->radius);
+  ww->srcs = (wave_src *) calloc (sizeof(*ww->srcs), ww->nwaves);
+
+  for (i = 0; i < ww->radius; i++)
+    {
+      float max = (cc->ncolors * (ww->radius - i) / (float) ww->radius);
+      ww->heights[i] = ((max + max * cos(i / 50.0)) / 2.0);
+    }
+
+  for (i = 0; i < ww->nwaves; i++)
+    {
+      ww->srcs[i].xth = frand(2.0) * M_PI;
+      ww->srcs[i].yth = frand(2.0) * M_PI;
+    }
+
+  cc->texture_width  = texture_size;
+  cc->texture_height = texture_size;
+}
+
+
+static int
+interference_point (cube_configuration *cc, int x, int y)
+{
+  /* Compute the effect of the waves on a pixel. */
+
+  waves *ww = cc->waves;
+  int result = 0;
+  int i;
+  for (i = 0; i < ww->nwaves; i++)
+    {
+      int dx = x - ww->srcs[i].x;
+      int dy = y - ww->srcs[i].y;
+      int dist = sqrt (dx*dx + dy*dy);
+      result += (dist >= ww->radius ? 0 : ww->heights[dist]);
+    }
+  result *= 0.4;
+  if (result > 255) result = 255;
+  return result;
+}
+
+
+static void
+interference (ModeInfo *mi)
+{
+  cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+  waves *ww = cc->waves;
+  int i;
+
+  /* Move the wave origins around
+   */
+  for (i = 0; i < ww->nwaves; i++)
+    {
+      ww->srcs[i].xth += (ww->speed / 1000.0);
+      if (ww->srcs[i].xth > 2*M_PI)
+        ww->srcs[i].xth -= 2*M_PI;
+      ww->srcs[i].yth += (ww->speed / 1000.0);
+      if (ww->srcs[i].yth > 2*M_PI)
+        ww->srcs[i].yth -= 2*M_PI;
+
+      ww->srcs[i].x = (cc->texture_width/2 +
+                       (cos (ww->srcs[i].xth) *
+                        cc->texture_width / 2));
+      ww->srcs[i].y = (cc->texture_height/2 +
+                       (cos (ww->srcs[i].yth) *
+                        cc->texture_height / 2));
+    }
+}
+
+
+/* qsort comparator for sorting cubes by y position */
+static int
+cmp_cubes (const void *aa, const void *bb)
+{
+  const cube *a = (cube *) aa;
+  const cube *b = (cube *) bb;
+  return ((int) (b->y * 10000) -
+          (int) (a->y * 10000));
+}
+
+
+ENTRYPOINT void 
+init_cube (ModeInfo *mi)
+{
+  int i;
+  cube_configuration *cc;
+
+  if (!ccs) {
+    ccs = (cube_configuration *)
+      calloc (MI_NUM_SCREENS(mi), sizeof (cube_configuration));
+    if (!ccs) {
+      fprintf(stderr, "%s: out of memory\n", progname);
+      exit(1);
+    }
+  }
+
+  cc = &ccs[MI_SCREEN(mi)];
+
+  if ((cc->glx_context = init_GL(mi)) != NULL) {
+    reshape_cube (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+  }
+
+  cc->trackball = gltrackball_init (True);
+
+  cc->ncolors = 256;
+  cc->colors = (XColor *) calloc(cc->ncolors, sizeof(XColor));
+
+  reset_colors (mi);
+  init_wave (mi);
+
+  cc->ncubes = MI_COUNT (mi);
+
+  if (cc->ncubes < 1) cc->ncubes = 1;
+
+  cc->cubes = (cube *) calloc (sizeof(cube), cc->ncubes);
+  for (i = 0; i < cc->ncubes; i++)
+    {
+      /* Set the size to roughly cover a 2x2 square on average. */
+      GLfloat scale = 1.8 / sqrt (cc->ncubes);
+      cube *cube = &cc->cubes[i];
+      cube->x = (frand(1)-0.5);
+      cube->y = (frand(1)-0.5);
+
+      cube->z = frand(0.12);
+      double th = (skew ? frand(skew) : 0) * M_PI / 180;
+      cube->cth = cos(th);
+      cube->sth = sin(th);
+
+      cube->w = scale * (frand(1) + 0.2);
+      cube->d = scale * (frand(1) + 0.2);
+
+      if (cube->x < cc->min_x) cc->min_x = cube->x;
+      if (cube->y < cc->min_y) cc->min_y = cube->y;
+      if (cube->x > cc->max_x) cc->max_x = cube->x;
+      if (cube->y > cc->max_y) cc->max_y = cube->y;
+    }
+
+  /* Sorting by depth improves frame rate slightly. With 6000 polygons we get:
+     3.9 FPS unsorted;
+     3.1 FPS back to front;
+     4.3 FPS front to back.
+   */
+  qsort (cc->cubes, cc->ncubes, sizeof(*cc->cubes), cmp_cubes);
+}
+
+
+static void
+animate_cubes (ModeInfo *mi)
+{
+  cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+  int i;
+  for (i = 0; i < cc->ncubes; i++)
+    {
+      cube *cube = &cc->cubes[i];
+      GLfloat fx = (cube->x - cc->min_x) / (cc->max_x - cc->min_x);
+      GLfloat fy = (cube->y - cc->min_y) / (cc->max_y - cc->min_y);
+      int x = (int) (cc->texture_width  * fx) % cc->texture_width;
+      int y = (int) (cc->texture_height * fy) % cc->texture_height;
+      unsigned char v = interference_point (cc, x, y);
+      cube->h = cube->z + (v / 256.0 / 2.5) + 0.1;
+    }
+}
+
+
+ENTRYPOINT void
+draw_cube (ModeInfo *mi)
+{
+  cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+  int wire = MI_IS_WIREFRAME(mi);
+  Display *dpy = MI_DISPLAY(mi);
+  Window window = MI_WINDOW(mi);
+  int i;
+
+  if (!cc->glx_context)
+    return;
+
+  mi->polygon_count = 0;
+  glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(cc->glx_context));
+
+  interference (mi);
+  animate_cubes (mi);
+
+  glShadeModel(GL_FLAT);
+
+  glEnable(GL_DEPTH_TEST);
+  glEnable(GL_NORMALIZE);
+  glEnable(GL_CULL_FACE);
+  /* glEnable (GL_POLYGON_OFFSET_FILL); */
+
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+  glPushMatrix ();
+
+  gltrackball_rotate (cc->trackball);
+  glRotatef (-180, 1, 0, 0);
+
+  {
+    GLfloat s = 15;
+    glScalef (s, s, s);
+  }
+  glRotatef (-90, 1, 0, 0);
+  glRotatef(current_device_rotation(), 0, 1, 0);
+
+  glTranslatef (-0.18, 0, -0.18);
+  glRotatef (37, 1, 0, 0);
+  glRotatef (20, 0, 0, 1);
+
+  glScalef (2.1, 2.1, 2.1);
+
+  /* Position lights after device rotation. */
+  if (!wire)
+    {
+      static const GLfloat pos[4] = {0.0, 0.25, -1.0, 0.0};
+      static const GLfloat amb[4] = {0.2, 0.2, 0.2, 1.0};
+      static const GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+
+      glLightfv(GL_LIGHT0, GL_POSITION, pos);
+      glLightfv(GL_LIGHT0, GL_AMBIENT,  amb);
+      glLightfv(GL_LIGHT0, GL_DIFFUSE,  dif);
+
+      glEnable(GL_LIGHTING);
+      glEnable(GL_LIGHT0);
+      glEnable(GL_DEPTH_TEST);
+      glEnable(GL_CULL_FACE);
+    }
+
+  glBegin (wire ? GL_LINES : GL_QUADS);
+
+  for (i = 0; i < cc->ncubes; i++)
+    {
+      cube *cube = &cc->cubes[i];
+      GLfloat cth = cube->cth;
+      GLfloat sth = cube->sth;
+      GLfloat x =  cth*cube->x + sth*cube->y;
+      GLfloat y = -sth*cube->x + cth*cube->y;
+      GLfloat w = cube->w/2;
+      GLfloat h = cube->h/2;
+      GLfloat d = cube->d/2;
+      GLfloat bottom = 5;
+
+      GLfloat xw =  cth*w, xd = sth*d;
+      GLfloat yw = -sth*w, yd = cth*d;
+
+      GLfloat color[4];
+      int c = cube->h * cc->ncolors * 0.7;
+      c %= cc->ncolors;
+
+      color[0] = cc->colors[c].red   / 65536.0;
+      color[1] = cc->colors[c].green / 65536.0;
+      color[2] = cc->colors[c].blue  / 65536.0;
+      color[3] = 1.0;
+      glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+
+      /* Putting this in a display list makes no performance difference. */
+
+      if (! wire)
+        {
+          glNormal3f (0, 0, -1);                               /* top */
+          glVertex3f (x+xw+xd, y+yw+yd, -h);
+          glVertex3f (x+xw-xd, y+yw-yd, -h);
+          glVertex3f (x-xw-xd, y-yw-yd, -h);
+          glVertex3f (x-xw+xd, y-yw+yd, -h);
+          mi->polygon_count++;
+
+          glNormal3f (sth, cth, 0);                            /* front */
+          glVertex3f (x+xw+xd, y+yw+yd, bottom);
+          glVertex3f (x+xw+xd, y+yw+yd, -h);
+          glVertex3f (x-xw+xd, y-yw+yd, -h);
+          glVertex3f (x-xw+xd, y-yw+yd, bottom);
+          mi->polygon_count++;
+
+          glNormal3f (cth, -sth, 0);                           /* right */
+          glVertex3f (x+xw-xd, y+yw-yd, -h);
+          glVertex3f (x+xw+xd, y+yw+yd, -h);
+          glVertex3f (x+xw+xd, y+yw+yd, bottom);
+          glVertex3f (x+xw-xd, y+yw-yd, bottom);
+          mi->polygon_count++;
+
+# if 0    /* Omitting these makes no performance difference. */
+
+          glNormal3f (-cth, sth, 0);                   /* left */
+          glVertex3f (x-xw+xd, y-yw+yd, -h);
+          glVertex3f (x-xw-xd, y-yw-yd, -h);
+          glVertex3f (x-xw-xd, y-yw-yd, bottom);
+          glVertex3f (x-xw+xd, y-yw+yd, bottom);
+          mi->polygon_count++;
+
+          glNormal3f (-sth, -cth, 0);                  /* back */
+          glVertex3f (x-xw-xd, y-yw-yd, bottom);
+          glVertex3f (x-xw-xd, y-yw-yd, -h);
+          glVertex3f (x+xw-xd, y+yw-yd, -h);
+          glVertex3f (x+xw-xd, y+yw-yd, bottom);
+          mi->polygon_count++;
+# endif
+        }
+      else
+        {
+          glNormal3f (0, 0, -1);                               /* top */
+          glVertex3f (x+xw+xd, y+yw+yd, -h);
+          glVertex3f (x+xw-xd, y+yw-yd, -h);
+
+          glVertex3f (x+xw-xd, y+yw-yd, -h);
+          glVertex3f (x-xw-xd, y-yw-yd, -h);
+
+          glVertex3f (x-xw-xd, y-yw-yd, -h);
+          glVertex3f (x-xw+xd, y-yw+yd, -h);
+
+          glVertex3f (x-xw+xd, y-yw+yd, -h);
+          glVertex3f (x+xw+xd, y+yw+yd, -h);
+          mi->polygon_count++;
+        }
+    }
+  glEnd();
+
+  glPolygonOffset (0, 0);
+
+# if 0
+  glDisable(GL_DEPTH_TEST);    /* Outline the playfield */
+  glColor3f(1,1,1);
+  glBegin(GL_LINE_LOOP);
+  glVertex3f (-0.5, -0.5, 0);
+  glVertex3f (-0.5,  0.5, 0);
+  glVertex3f ( 0.5,  0.5, 0);
+  glVertex3f ( 0.5, -0.5, 0);
+  glEnd();
+# endif
+
+  glPopMatrix();
+
+  if (mi->fps_p) do_fps (mi);
+  glFinish();
+
+  glXSwapBuffers(dpy, window);
+}
+
+
+XSCREENSAVER_MODULE_2 ("Cityflow", cityflow, cube)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/cityflow.man b/hacks/glx/cityflow.man
new file mode 100644 (file)
index 0000000..eabcdc2
--- /dev/null
@@ -0,0 +1,77 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+cityflow - waves of boxes.
+.SH SYNOPSIS
+.B cityflow
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-count \fInumber\fP]
+[\-wave-speed \fInumber\fP]
+[\-wave-radius \fInumber\fP]
+[\-waves \fInumber\fP]
+[\-skew \fInumber\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Waves move across a sea of boxes. The city swells. The walls are closing
+in.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 20000 (0.02 seconds).
+.TP 8
+.B \-count \fInumber\fP
+Boxes. 50 - 4000.  Default: 800.
+.TP 8
+.B \-wave-speed \fInumber\fP
+Wave speed.  5 - 150.  Default: 25.
+.TP 8
+.B \-wave-radius \fInumber\fP
+Wave overlap.  5 - 512.  Default: 256.
+.TP 8
+.B \-waves \fInumber\fP
+Wave complexity.  1 - 20.  Default: 6.
+.TP 8
+.B \-skew \fInumber\fP
+Skew.  0 - 45. Default: 12.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2012 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.
index 64e53028c6d04ca70bc211afb486fa897d5ddbe0..85c6294090da6a632c0748da872cba5d48084a65 100644 (file)
@@ -1335,6 +1335,19 @@ ENTRYPOINT Bool crackberg_handle_event (ModeInfo *mi, XEvent *ev)
       if (dy > 0 && dy > dx) dx = 0;
       if (dy < 0 && dy < dx) dx = 0;
 
+      {
+        int rot = current_device_rotation();
+        int swap;
+        while (rot <= -180) rot += 360;
+        while (rot >   180) rot -= 360;
+        if (rot > 135 || rot < -135)           /* 180 */
+            dx = -dx, dy = -dy;
+        else if (rot > 45)                     /* 90 */
+          swap = dx, dx = -dy, dy = swap;
+        else if (rot < -45)                    /* 270 */
+          swap = dx, dx = dy, dy = -swap;
+      }
+
       if      (dx > 0) cberg->motion_state |= MOTION_LEFT;
       else if (dx < 0) cberg->motion_state |= MOTION_RIGHT;
       else if (dy > 0) cberg->motion_state |= MOTION_FORW;
index b5bba46ed6d1f97ccb7d6b02735bd09445b6b2a0..f3fd88bbb262f6eed0889857185963b81e7723f8 100644 (file)
@@ -291,7 +291,6 @@ init_cube (ModeInfo *mi)
   draw_faces (mi);
   glEndList ();
 
-  glDrawBuffer(dbuf_p ? GL_BACK : GL_FRONT);
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 }
 
@@ -309,6 +308,8 @@ draw_cube (ModeInfo *mi)
   if (!bp->glx_context)
     return;
 
+  glDrawBuffer(dbuf_p ? GL_BACK : GL_FRONT);
+
   glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
 
   glShadeModel(GL_SMOOTH);
index d29ec0d6f486f248f1dd145b1684a1ca5fd882d5..77ebe21e4d4333c4ee77bce0fcfe4593e136a83d 100644 (file)
@@ -24,7 +24,7 @@
 #ifdef STANDALONE
 #define DEFAULTS        "*delay:           30000        \n" \
                         "*showFPS:         False        \n" \
-                       "*titleFont:  -*-helvetica-medium-r-normal-*-180-*\n" \
+       "*titleFont:  -*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*\n" \
 
 # define refresh_engine 0
 # include "xlockmore.h"              /* from the xscreensaver distribution */
@@ -32,7 +32,7 @@
 # include "xlock.h"                  /* from the xlockmore distribution */
 #endif /* !STANDALONE */
 
-#include "glxfonts.h"
+#include "texfont.h"
 #include "rotator.h"
 #include "gltrackball.h"
 
@@ -895,7 +895,8 @@ ENTRYPOINT void init_engine(ModeInfo *mi)
     e->trackball = gltrackball_init (True);
  }
 
- if ((e->glx_context = init_GL(mi)) != NULL) {
+ if (!e->glx_context &&   /* re-initting breaks print_texture_label */
+     (e->glx_context = init_GL(mi)) != NULL) {
       reshape_engine(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
  } else {
      MI_CLEARWINDOW(mi);
@@ -972,10 +973,9 @@ ENTRYPOINT void draw_engine(ModeInfo *mi)
 
   glColor3f (1, 1, 0);
   if (do_titles)
-      print_gl_string (mi->dpy, e->font_data,
-                       mi->xgwa.width, mi->xgwa.height,
-                       10, mi->xgwa.height - 10,
-                       e->engine_name, False);
+      print_texture_label (mi->dpy, e->font_data,
+                           mi->xgwa.width, mi->xgwa.height,
+                           1, e->engine_name);
 
   if(mi->fps_p) do_fps(mi);
   glFinish(); 
index 798c1c685ae0f5f6d6f2fc5ad818729d56f6f07e..48bc37cb4c1ae01d84dabe9d1edc0df772c7d4eb 100644 (file)
 # include "config.h"
 #endif /* HAVE_CONFIG_H */
 
-/* Utopia 800 needs 64 512x512 textures (4096x4096 bitmap).
-   Utopia 720 needs 16 512x512 textures (2048x2048 bitmap).
-   Utopia 480 needs 16 512x512 textures (2048x2048 bitmap).
-   Utopia 400 needs  4 512x512 textures (1024x1024 bitmap).
-   Utopia 180 needs  1 512x512 texture.
-   Times  240 needs  1 512x512 texture.
- */
-#define DEF_FONT       "-*-utopia-bold-r-normal-*-*-720-*-*-*-*-iso8859-1"
+#define DEF_FONT       "-*-utopia-bold-r-normal-*-*-720-*-*-*-*-*-*"
 #define DEF_COLOR      "#00CCFF"
 
 #define DEFAULTS "*delay:        10000      \n" \
                 "*showFPS:      False      \n" \
                 "*wireframe:    False      \n" \
                 "*usePty:       False      \n" \
+                "*texFontCacheSize: 60     \n" \
                 "*font:       " DEF_FONT  "\n" \
                 ".foreground: " DEF_COLOR "\n" \
+                "*program: xscreensaver-text --cols 0"  /* don't wrap */
 
 # define refresh_fliptext 0
 # define fliptext_handle_event 0
@@ -54,7 +49,6 @@
 # endif
 
 
-#define DEF_PROGRAM    "xscreensaver-text --cols 0"  /* don't wrap */
 #define DEF_LINES      "8"
 #define DEF_FONT_SIZE  "20"
 #define DEF_COLUMNS    "80"
@@ -120,7 +114,6 @@ typedef struct {
 
 static fliptext_configuration *scs = NULL;
 
-static char *program;
 static int max_lines, min_lines;
 static float font_size;
 static int target_columns;
@@ -129,7 +122,6 @@ static int alignment, alignment_random_p;
 static GLfloat speed;
 
 static XrmOptionDescRec opts[] = {
-  {"-program",     ".program",   XrmoptionSepArg, 0 },
   {"-lines",       ".lines",     XrmoptionSepArg, 0 },
   {"-size",       ".fontSize",  XrmoptionSepArg, 0 },
   {"-columns",    ".columns",   XrmoptionSepArg, 0 },
@@ -142,7 +134,6 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-  {&program,        "program",   "Program",    DEF_PROGRAM,   t_String},
   {&max_lines,      "lines",     "Integer",    DEF_LINES,     t_Int},
   {&font_size,      "fontSize",  "Float",      DEF_FONT_SIZE, t_Float},
   {&target_columns, "columns",   "Integer",    DEF_COLUMNS,   t_Int},
@@ -814,8 +805,6 @@ init_fliptext (ModeInfo *mi)
     clear_gl_error(); /* WTF? sometimes "invalid op" from glViewport! */
   }
 
-  program = get_string_resource (mi->dpy, "program", "Program");
-
   {
     int cw, lh;
     sc->texfont = load_texture_font (MI_DISPLAY(mi), "font");
diff --git a/hacks/glx/font-ximage.c b/hacks/glx/font-ximage.c
deleted file mode 100644 (file)
index 22ef3a8..0000000
+++ /dev/null
@@ -1,256 +0,0 @@
-/* font-ximage.c --- renders text to an XImage for use with OpenGL.
- * xscreensaver, Copyright (c) 2001-2013 Jamie Zawinski <jwz@jwz.org>
- *
- * 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 <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#ifdef HAVE_COCOA
-# include "jwxyz.h"
-#else  /* !HAVE_COCOA */
-# include <X11/Xlib.h>
-# include <X11/Xutil.h>
-# include <GL/gl.h>    /* only for GLfloat */
-#endif /* !HAVE_COCOA */
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
-
-extern char *progname;
-
-#include "font-ximage.h"
-
-#undef MAX
-#define MAX(a,b) ((a)>(b)?(a):(b))
-
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
-#if 0
-static Bool
-bigendian (void)
-{
-  union { int i; char c[sizeof(int)]; } u;
-  u.i = 1;
-  return !u.c[0];
-}
-#endif
-
-/* return the next larger power of 2. */
-static int
-to_pow2 (int i)
-{
-  static const unsigned int pow2[] = { 
-    1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024,
-    2048, 4096, 8192, 16384, 32768, 65536 };
-  int j;
-  for (j = 0; j < countof(pow2); j++)
-    if (pow2[j] >= i) return pow2[j];
-  abort();  /* too big! */
-}
-
-
-/* Returns an XImage structure containing the string rendered in the font.
-   This XImage will be 32 bits per pixel, 8 each per R, G, and B, with the
-   extra byte set to 0xFF.
-
-   Foreground and background are GL-style color specifiers: 4 floats from
-   0.0-1.0.
- */
-XImage *
-text_to_ximage (Screen *screen, Visual *visual,
-                const char *font,
-                const char *text_lines,
-                GLfloat *texture_fg,
-                GLfloat *texture_bg)
-{
-  Display *dpy = DisplayOfScreen (screen);
-  int width, height;
-  XFontStruct *f;
-  Pixmap bitmap;
-
-  f = XLoadQueryFont(dpy, font);
-  if (!f)
-    {
-      f = XLoadQueryFont(dpy, "fixed");
-      if (f)
-        fprintf (stderr, "%s: unable to load font \"%s\"; using \"fixed\".\n",
-                 progname, font);
-      else
-        {
-          fprintf (stderr, "%s: unable to load fonts \"%s\" or \"fixed\"!\n",
-                   progname, font);
-          exit (1);
-        }
-    }
-
-  /* Parse the text, and render it to `bitmap'
-   */
-  {
-    char *text, *text2, *line, *token;
-    int lines;
-    XCharStruct overall;
-    XGCValues gcv;
-    GC gc;
-
-    int margin = 2;
-    int fg = 1;
-    int bg = 0;
-    int xoff, yoff;
-
-    text  = strdup (text_lines);
-    while (*text &&
-           (text[strlen(text)-1] == '\r' ||
-            text[strlen(text)-1] == '\n'))
-      text[strlen(text)-1] = 0;
-
-    text2 = strdup (text);
-
-    memset(&overall, 0, sizeof(overall));
-    token = text;
-    lines = 0;
-    while ((line = strtok (token, "\r\n")))
-      {
-        XCharStruct o2;
-        int ascent, descent, direction;
-        token = 0;
-        XTextExtents (f, line, (int) strlen(line),
-                      &direction, &ascent, &descent, &o2);
-        overall.lbearing = MAX(overall.lbearing, o2.lbearing);
-        overall.rbearing = MAX(overall.rbearing, o2.rbearing);
-        lines++;
-      }
-    free (text);
-    text = 0;
-
-    width = overall.lbearing + overall.rbearing + margin + margin + 1;
-    height = ((f->ascent + f->descent) * lines) + margin + margin;
-
-    /* GL texture sizes must be powers of two. */
-    {
-      int w2 = to_pow2(width);
-      int h2 = to_pow2(height);
-      xoff = (w2 - width)  / 2;
-      yoff = (h2 - height) / 2;
-      width  = w2;
-      height = h2;
-    }
-
-    bitmap = XCreatePixmap(dpy, RootWindowOfScreen (screen), width, height, 1);
-
-    gcv.font = f->fid;
-    gcv.foreground = bg;
-    gc = XCreateGC (dpy, bitmap, (GCFont | GCForeground), &gcv);
-    XFillRectangle(dpy, bitmap, gc, 0, 0, width, height);
-    XSetForeground(dpy, gc, fg);
-
-    token = text2;
-    lines = 0;
-    while ((line = strtok(token, "\r\n")))
-      {
-        XCharStruct o2;
-        int ascent, descent, direction;
-        token = 0;
-
-        XTextExtents(f, line, (int)strlen(line),
-                     &direction, &ascent, &descent, &o2);
-        XDrawString(dpy, bitmap, gc,
-                    overall.lbearing + margin + xoff,
-                    ((f->ascent * (lines + 1)) +
-                     (f->descent * lines) +
-                     margin +
-                     yoff),
-                    line, (int) strlen(line));
-        lines++;
-      }
-    free(text2);
-
-    XUnloadFont(dpy, f->fid);
-    XFree((XPointer) f);
-    XFreeGC(dpy, gc);
-  }
-
-  /* Convert the server-side Pixmap to a client-side GL-ordered XImage.
-   */
-  {
-    XImage *ximage1, *ximage2;
-    unsigned long fg, bg;
-    int x, y;
-
-    ximage1 = XGetImage (dpy, bitmap, 0, 0, width, height, ~0L, ZPixmap);
-    XFreePixmap(dpy, bitmap);
-    ximage2 = XCreateImage (dpy, visual, 32, ZPixmap, 0, 0,
-                            width, height, 32, 0);
-
-    ximage2->data = (char *) malloc (height * ximage2->bytes_per_line);
-
-    /* Translate the 1-bit image to a deep image:
-       first figure out what the colors are.
-     */
-    {
-      int rpos, gpos, bpos, apos;  /* bitfield positions */
-
-      /* Note that unlike X, which is endianness-agnostic (since any XImage
-         can have its own specific bit ordering, with the server reversing
-         things as necessary) OpenGL pretends everything is client-side, so
-         we need to pack things in the right order for the client machine.
-       */
-#if 0
-    /* #### Cherub says that the little-endian case must be taken on MacOSX,
-            or else the colors/alpha are the wrong way around.  How can
-            that be the case?
-     */
-      if (bigendian())
-        rpos = 24, gpos = 16, bpos =  8, apos =  0;
-      else
-#endif
-        rpos =  0, gpos =  8, bpos = 16, apos = 24;
-
-      fg = (((unsigned long) (texture_fg[0] * 255.0) << rpos) |
-            ((unsigned long) (texture_fg[1] * 255.0) << gpos) |
-            ((unsigned long) (texture_fg[2] * 255.0) << bpos) |
-            ((unsigned long) (texture_fg[3] * 255.0) << apos));
-      bg = (((unsigned long) (texture_bg[0] * 255.0) << rpos) |
-            ((unsigned long) (texture_bg[1] * 255.0) << gpos) |
-            ((unsigned long) (texture_bg[2] * 255.0) << bpos) |
-            ((unsigned long) (texture_bg[3] * 255.0) << apos));
-    }
-
-    for (y = 0; y < height; y++)
-      {
-       int y2 = (height-1-y); /* Texture maps are upside down. */
-       for (x = 0; x < width; x++)
-          XPutPixel (ximage2, x, y, 
-                     XGetPixel (ximage1, x, y2) ? fg : bg);
-      }
-
-    XDestroyImage (ximage1);
-
-#if 0
-    for (y = 0; y < height; y++)
-      {
-       int y2 = (height-1-y); /* Texture maps are upside down. */
-       for (x = 0; x < width; x++)
-          fputc ((XGetPixel (ximage2, x, y2) == fg ? '#' : ' '), stdout);
-        fputc ('\n', stdout);
-      }
-    fputc ('\n', stdout);
-#endif /* 0 */
-
-    return ximage2;
-  }
-}
diff --git a/hacks/glx/font-ximage.h b/hacks/glx/font-ximage.h
deleted file mode 100644 (file)
index cd9d56e..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-/* font-ximage.c --- renders text to an XImage for use with OpenGL.
- * xscreensaver, Copyright (c) 2001 Jamie Zawinski <jwz@jwz.org>
- *
- * 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 __FONT_XIMAGE_H__
-# define __FONT_XIMAGE_H__
-
-/* Returns an XImage structure containing the string rendered in the font.
-   This XImage will be 32 bits per pixel, 8 each per R, G, and B, with the
-   extra byte set to 0xFF.
-
-   Foregroune and background are GL-style color specifiers: 4 floats from
-   0.0-1.0.
- */
-XImage *text_to_ximage (Screen *screen, Visual *visual,
-                        const char *font,
-                        const char *text_lines,
-                        GLfloat *texture_fg,
-                        GLfloat *texture_bg);
-
-
-#endif /* __FONT_XIMAGE_H__ */
index b94c098cf8bedc505a7947143667e04cfe149598..46757708c937c6bb3698b543b3cdb30553a6dd83 100644 (file)
@@ -16,7 +16,9 @@
 
 #ifdef HAVE_COCOA
 # include "jwxyz.h"
-#else /* !HAVE_COCOA -- real Xlib */
+#elif defined(HAVE_ANDROID)
+# include <GLES/gl.h>
+#else /* real Xlib */
 # include <GL/glx.h>
 # include <GL/glu.h>
 #endif /* !HAVE_COCOA */
 
 #include "xlockmoreI.h"
 #include "fpsI.h"
-#include "glxfonts.h"
+#include "texfont.h"
 
 /* These are in xlock-gl.c */
 extern void clear_gl_error (void);
 extern void check_gl_error (const char *type);
 
+typedef struct {
+  texture_font_data *texfont;
+  int line_height;
+} gl_fps_data;
+
 
 static void
 xlockmore_gl_fps_init (fps_state *st)
 {
-  st->gl_fps_data = load_texture_font (st->dpy, "fpsFont");
+  gl_fps_data *data = (gl_fps_data *) calloc (1, sizeof(*data));
+  data->texfont = load_texture_font (st->dpy, "fpsFont");
+  texture_string_width (data->texfont, "M", &data->line_height);
+  st->gl_fps_data = data;
 }
 
 
-
 /* Callback in xscreensaver_function_table, via xlockmore.c.
  */
 void
@@ -67,10 +76,10 @@ xlockmore_gl_draw_fps (ModeInfo *mi)
   fps_state *st = mi->fpst;
   if (st)   /* might be too early */
     {
+      gl_fps_data *data = (gl_fps_data *) st->gl_fps_data;
       XWindowAttributes xgwa;
       int lines = 1;
       const char *s;
-      int lh = st->font->ascent + st->font->descent;
       int y = st->y;
 
       XGetWindowAttributes (st->dpy, st->window, &xgwa);
@@ -78,12 +87,12 @@ xlockmore_gl_draw_fps (ModeInfo *mi)
         if (*s == '\n') lines++;
 
       if (y < 0)
-        y = xgwa.height + y - lines*lh;
-      y += lines*lh + st->font->descent;
+        y = xgwa.height + y - (lines * data->line_height);
+      y += lines * data->line_height;
 
       glColor3f (1, 1, 1);
-      print_gl_string (st->dpy, st->gl_fps_data,
-                       xgwa.width, xgwa.height,
-                       st->x, y, st->string, st->clear_p);
+      print_texture_label (st->dpy, data->texfont,
+                           xgwa.width, xgwa.height,
+                           2, st->string);
     }
 }
index 5a8fd86f2eb82a698e79fc7d48179cca591c13d5..61599f9ae5e372ed490379bea978101acf41f69c 100644 (file)
@@ -238,7 +238,8 @@ new_gear (ModeInfo *mi, gear *parent)
     double pix = g->tooth_h * MI_HEIGHT(mi); /* approx. tooth size in pixels */
     if (pix <= 2.5)      g->size = INVOLUTE_SMALL;
     else if (pix <= 3.5) g->size = INVOLUTE_MEDIUM;
-    else                 g->size = INVOLUTE_LARGE;
+    else if (pix <= 25)  g->size = INVOLUTE_LARGE;
+    else                 g->size = INVOLUTE_HUGE;
   }
 
   g->base_p = !parent;
diff --git a/hacks/glx/geodesicgears.c b/hacks/glx/geodesicgears.c
new file mode 100644 (file)
index 0000000..83127c4
--- /dev/null
@@ -0,0 +1,1783 @@
+/* geodesicgears, Copyright (c) 2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * 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 http://bugman123.com/Gears/
+ * and by http://kennethsnelson.net/PortraitOfAnAtom.pdf
+ */
+
+#define DEFAULTS       "*delay:        30000       \n" \
+                       "*count:        4           \n" \
+                       "*wireframe:    False       \n" \
+                       "*showFPS:      False       \n" \
+                       "*texFontCacheSize: 100     \n" \
+               "*font:  -*-helvetica-medium-r-normal-*-*-160-*-*-*-*-*-*\n" \
+
+# define refresh_geodesic 0
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "involute.h"
+#include "colors.h"
+#include "normals.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+#include "texfont.h"
+
+
+#ifdef USE_GL /* whole file */
+
+#include "gllist.h"
+
+#define DEF_SPIN        "True"
+#define DEF_WANDER      "True"
+#define DEF_SPEED       "1.0"
+#define DEF_LABELS      "False"
+#define DEF_NUMBERS     "False"
+#define DEF_TIMEOUT     "20"
+
+typedef struct { double a, o; } LL;    /* latitude + longitude */
+
+/* 10:6 is a mismesh. */
+
+static const struct {
+  enum { PRISM, OCTO, DECA, G14, G18, G32, G92, G182 } type;
+  const GLfloat args[5];
+} gear_templates[] = {
+  { PRISM },
+  { OCTO },
+  { DECA },
+  { G14 },
+  { G18 },
+  { G32, { 15, 6,  0.4535 }},          /* teeth1, teeth2, radius1 */
+  { G32, { 15, 12, 0.3560 }},
+  { G32, { 20, 6,  0.4850 }},
+  { G32, { 20, 12, 0.3995 }},          /* double of 10:6 */
+  { G32, { 20, 18, 0.3375 }},
+  { G32, { 25, 6,  0.5065 }},
+  { G32, { 25, 12, 0.4300 }},
+  { G32, { 25, 18, 0.3725 }},
+  { G32, { 25, 24, 0.3270 }},
+  { G32, { 30, 12, 0.4535 }},          /* double of 15:6 */
+  { G32, { 30, 18, 0.3995 }},
+  { G32, { 30, 24, 0.3560 }},          /* double of 15:12 */
+  { G32, { 30, 30, 0.3205 }},
+  { G32, { 35, 12, 0.4710 }},
+  { G32, { 35, 18, 0.4208 }},
+  { G32, { 35, 24, 0.3800 }},
+  { G32, { 35, 30, 0.3450 }},
+  { G32, { 35, 36, 0.3160 }},
+  { G32, { 40, 12, 0.4850 }},          /* double of 20:6 */
+  { G32, { 40, 24, 0.3995 }},          /* double of 10:6, 20:12 */
+/*{ G32, { 40, 36, 0.3375 }},*/                /* double of 20:18 */
+  { G32, { 50, 12, 0.5065 }},          /* double of 25:6 */
+  { G32, { 50, 24, 0.4300 }},          /* double of 25:12 */
+
+  /* These all have phase errors and don't always mesh properly.
+     Maybe we should just omit them? */
+
+  { G92, { 35, 36, 16, 0.2660, 0.366 }},       /* teeth1, 2, 3, r1, pitch3 */
+  { G92, { 25, 36, 11, 0.2270, 0.315 }},
+/*{ G92, { 15, 15,  8, 0.2650, 0.356 }},*/
+/*{ G92, { 20, 21,  8, 0.2760, 0.355 }},*/
+  { G92, { 25, 27, 16, 0.2320, 0.359 }},
+  { G92, { 20, 36, 11, 0.1875, 0.283 }},
+  { G92, { 30, 30, 16, 0.2585, 0.374 }},       /* double of 15:15:8 */
+  { G92, { 20, 33, 11, 0.1970, 0.293 }},
+/*{ G92, { 10, 12,  8, 0.2030, 0.345 }},*/
+  { G92, { 30, 33, 16, 0.2455, 0.354 }},
+/*{ G92, { 25, 24,  8, 0.3050, 0.375 }},*/
+  { G92, { 20, 24, 16, 0.2030, 0.346 }},
+};
+
+
+typedef struct sphere_gear sphere_gear;
+struct sphere_gear {
+  int id;                      /* name, for debugging */
+  XYZ axis;                    /* the vector on which this gear's axis lies */
+  int direction;               /* rotation, +1 or -1 */
+  GLfloat offset;              /* rotational degrees from parent gear */
+  sphere_gear *parent;         /* gear driving this one, or 0 for root */
+  sphere_gear **children;      /* gears driven by this one (no loops) */
+  sphere_gear **neighbors;     /* gears touching this one (circular!) */
+  int nchildren, children_size;
+  int nneighbors, neighbors_size;
+  const gear *g;               /* shape of this gear (shared) */
+};
+
+
+typedef struct {
+  GLXContext *glx_context;
+  rotator *rot;
+  trackball_state *trackball;
+  Bool button_down_p;
+  int ncolors;
+  XColor *colors;
+  GLfloat color1[4], color2[4];
+  texture_font_data *font;
+
+  int nshapes, shapes_size;    /* how many 'gear' objects there are */
+  int ngears, gears_size;      /* how many 'sphere_gear' objects there are */
+  gear *shapes;
+  sphere_gear *gears;
+
+  int which;
+  int mode;  /* 0 = normal, 1 = out, 2 = in */
+  int mode_tick;
+  int next;  /* 0 = random, -1 = back, 1 = forward */
+  time_t draw_time;
+  int draw_tick;
+  char *desc;
+
+  GLfloat th;          /* rotation of the root sphere_gear in degrees. */
+
+} geodesic_configuration;
+
+static geodesic_configuration *bps = NULL;
+
+static int timeout;
+static Bool do_spin;
+static GLfloat speed;
+static Bool do_wander;
+static Bool do_labels;
+static Bool do_numbers;
+
+static XrmOptionDescRec opts[] = {
+  { "-spin",      ".spin",   XrmoptionNoArg, "True"  },
+  { "+spin",      ".spin",   XrmoptionNoArg, "False" },
+  { "-speed",     ".speed",  XrmoptionSepArg, 0      },
+  { "-wander",    ".wander", XrmoptionNoArg, "True"  },
+  { "+wander",    ".wander", XrmoptionNoArg, "False" },
+  { "-labels",   ".labels", XrmoptionNoArg, "True"  },
+  { "+labels",   ".labels", XrmoptionNoArg, "False" },
+  { "-numbers",          ".numbers",XrmoptionNoArg, "True"  },
+  { "+numbers",          ".numbers",XrmoptionNoArg, "False" },
+  { "-timeout",          ".timeout",XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+  {&do_spin,   "spin",   "Spin",   DEF_SPIN,   t_Bool},
+  {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+  {&speed,     "speed",  "Speed",  DEF_SPEED,  t_Float},
+  {&do_labels, "labels", "Labels", DEF_LABELS, t_Bool},
+  {&do_numbers,"numbers","Numbers",DEF_NUMBERS,t_Bool},
+  {&timeout,   "timeout","Seconds",DEF_TIMEOUT,t_Int},
+};
+
+ENTRYPOINT ModeSpecOpt geodesic_opts = {
+  countof(opts), opts, countof(vars), vars, NULL};
+
+
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
+
+
+static XYZ
+cross_product (XYZ a, XYZ b)
+{
+  XYZ c;
+  c.x = (a.y * b.z) - (a.z * b.y);
+  c.y = (a.z * b.x) - (a.x * b.z);
+  c.z = (a.x * b.y) - (a.y * b.x);
+  return c;
+}
+
+
+static GLfloat
+dot_product (XYZ a, XYZ b)
+{
+  return (a.x * b.x) + (a.y * b.y) + (a.z * b.z);
+}
+
+
+static XYZ
+normalize (XYZ v)
+{
+  GLfloat d = sqrt ((v.x * v.x) + (v.y * v.y) + (v.z * v.z));
+  if (d == 0)
+    v.x = v.y = v.z = 0;
+  else
+    {
+      v.x /= d;
+      v.y /= d;
+      v.z /= d;
+    }
+  return v;
+}
+
+
+static XYZ
+polar_to_cartesian (LL v)
+{
+  XYZ p;
+  p.x = cos (v.a) * cos (v.o);
+  p.y = cos (v.a) * sin (v.o);
+  p.z = sin (v.a);
+  return p;
+}
+
+
+
+
+static gear *
+add_gear_shape (ModeInfo *mi, GLfloat radius, int teeth)
+{
+  geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+  int wire = MI_IS_WIREFRAME(mi);
+  gear *g;
+  int i;
+
+  if (bp->nshapes >= bp->shapes_size - 1)
+    {
+      bp->shapes_size = bp->shapes_size * 1.2 + 4;
+      bp->shapes = (gear *)
+        realloc (bp->shapes, bp->shapes_size * sizeof(*bp->shapes));
+    }
+  g = &bp->shapes[bp->nshapes++];
+
+  memset (g, 0, sizeof(*g));
+
+  g->r = radius;
+  g->nteeth = teeth;
+  g->ratio = 1;
+
+  g->tooth_h = g->r / (teeth * 0.4);
+
+  if (g->tooth_h > 0.06)  /* stubbier teeth when small tooth count. */
+    g->tooth_h *= 0.6;
+
+  g->thickness  = 0.05 + BELLRAND(0.15);
+  g->thickness2 = g->thickness / 4;
+  g->thickness3 = g->thickness;
+  g->size       = wire ? INVOLUTE_SMALL : INVOLUTE_LARGE;
+
+  /* Move the disc's origin inward to make the edge of the disc be tangent
+     to the unit sphere. */
+  g->z = 1 - sqrt (1 - (g->r * g->r));
+
+  /* #### This isn't quite right */
+  g->tooth_slope = 1 + ((g->z * 2) / g->r);
+
+
+  /* Decide on shape of gear interior:
+     - just a ring with teeth;
+     - that, plus a thinner in-set "plate" in the middle;
+     - that, plus a thin raised "lip" on the inner plate;
+     - or, a wide lip (really, a thicker third inner plate.)
+   */
+  if (wire)
+    ;
+  else if ((random() % 10) == 0)
+    {
+      /* inner_r can go all the way in; there's no inset disc. */
+      g->inner_r = (g->r * 0.3) + frand((g->r - g->tooth_h/2) * 0.6);
+      g->inner_r2 = 0;
+      g->inner_r3 = 0;
+    }
+  else
+    {
+      /* inner_r doesn't go in very far; inner_r2 is an inset disc. */
+      g->inner_r  = (g->r * 0.5)  + frand((g->r - g->tooth_h) * 0.4);
+      g->inner_r2 = (g->r * 0.1) + frand(g->inner_r * 0.5);
+      g->inner_r3 = 0;
+
+      if (g->inner_r2 > (g->r * 0.2))
+        {
+          int nn = (random() % 10);
+          if (nn <= 2)
+            g->inner_r3 = (g->r * 0.1) + frand(g->inner_r2 * 0.2);
+          else if (nn <= 7 && g->inner_r2 >= 0.1)
+            g->inner_r3 = g->inner_r2 - 0.01;
+        }
+    }
+
+  /* If we have three discs, sometimes make the middle disc be spokes.
+   */
+  if (g->inner_r3 && ((random() % 5) == 0))
+    {
+      g->spokes = 2 + BELLRAND (5);
+      g->spoke_thickness = 1 + frand(7.0);
+      if (g->spokes == 2 && g->spoke_thickness < 2)
+        g->spoke_thickness += 1;
+    }
+
+  /* Sometimes add little nubbly bits, if there is room.
+   */
+  if (!wire && g->nteeth > 5)
+    {
+      double size = 0;
+      involute_biggest_ring (g, 0, &size, 0);
+      if (size > g->r * 0.2 && (random() % 5) == 0)
+        {
+          g->nubs = 1 + (random() % 16);
+          if (g->nubs > 8) g->nubs = 1;
+        }
+    }
+
+  /* Decide how complex the polygon model should be.
+   */
+  {
+    double pix = g->tooth_h * MI_HEIGHT(mi); /* approx. tooth size in pixels */
+    if (pix <= 4)        g->size = INVOLUTE_SMALL;
+    else if (pix <= 8)   g->size = INVOLUTE_MEDIUM;
+    else if (pix <= 30)  g->size = INVOLUTE_LARGE;
+    else                 g->size = INVOLUTE_HUGE;
+  }
+
+  if (g->inner_r3 > g->inner_r2) abort();
+  if (g->inner_r2 > g->inner_r) abort();
+  if (g->inner_r  > g->r) abort();
+
+  i = random() % bp->ncolors;
+  g->color[0] = bp->colors[i].red    / 65536.0;
+  g->color[1] = bp->colors[i].green  / 65536.0;
+  g->color[2] = bp->colors[i].blue   / 65536.0;
+  g->color[3] = 1;
+
+  i = (i + bp->ncolors / 2) % bp->ncolors;
+  g->color2[0] = bp->colors[i].red    / 65536.0;
+  g->color2[1] = bp->colors[i].green  / 65536.0;
+  g->color2[2] = bp->colors[i].blue   / 65536.0;
+  g->color2[3] = 1;
+
+  g->dlist = glGenLists (1);
+  glNewList (g->dlist, GL_COMPILE);
+
+#if 1
+  {
+    gear G, *g2 = &G;
+    *g2 = *g;
+
+    /* Move the gear inward so that its outer edge is on the disc, instead
+       of its midpoint. */
+    g2->z += g2->thickness/2;
+
+    /* 'radius' is at the surface but 'g->r' is at the center, so we need
+       to reverse the slope computation that involute.c does. */
+    g2->r /= (1 + (g2->thickness * g2->tooth_slope / 2));
+
+    glPushMatrix();
+    glTranslatef(g2->x, g2->y, -g2->z);
+
+    /* Line up the center of the point of tooth 0 with "up". */
+    glRotatef (90, 0, 0, 1);
+    glRotatef (180, 0, 1, 0);
+    glRotatef (-360.0 / g2->nteeth / 4, 0, 0, 1);
+
+    g->polygons = draw_involute_gear (g2, wire);
+    glPopMatrix();
+  }
+# else  /* draw discs */
+  {
+    glPushMatrix();
+    glTranslatef(g->x, g->y, -g->z);
+    glLineWidth (2);
+    glFrontFace (GL_CCW);
+    glNormal3f(0, 0, 1);
+    glColor3f(0, 0, 0);
+    glDisable (GL_LIGHTING);
+
+    glBegin(GL_LINES);
+    glVertex3f (0, 0, 0);
+    glVertex3f (0, radius, 0);
+    glEnd();
+
+    glColor3f(0.5, 0.5, 0.5);
+    glBegin(wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
+    {
+      GLfloat th;
+      GLfloat step = M_PI * 2 / 128;
+      /* radius *= 1.005; */
+      glVertex3f (0, 0, 0);
+      for (th = 0; th < M_PI * 2 + step; th += step)
+        {
+          GLfloat x = cos(th) * radius;
+          GLfloat y = sin(th) * radius;
+          glVertex3f (x, y, 0);
+        }
+    }
+    glEnd();
+    if (!wire) glEnable(GL_LIGHTING);
+    glPopMatrix();
+  }
+# endif /* 0 */
+
+  glEndList ();
+
+  return g;
+}
+
+
+static void
+add_sphere_gear (ModeInfo *mi, gear *g, XYZ axis)
+{
+  geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+  sphere_gear *gg;
+  int i;
+
+  axis = normalize (axis);
+
+  /* If there's already a gear on this axis, don't duplicate it. */
+  for (i = 0; i < bp->ngears; i++)
+    {
+      XYZ o = bp->gears[i].axis;
+      if (o.x == axis.x && o.y == axis.y && o.z == axis.z)
+        return;
+    }
+
+  if (bp->ngears >= bp->gears_size - 1)
+    {
+      bp->gears_size = bp->gears_size * 1.2 + 10;
+      bp->gears = (sphere_gear *)
+        realloc (bp->gears, bp->gears_size * sizeof(*bp->gears));
+    }
+
+  gg = &bp->gears[bp->ngears];
+  memset (gg, 0, sizeof(*gg));
+  gg->id = bp->ngears;
+  gg->axis = axis;
+  gg->direction = 0;
+  gg->g = g;
+  bp->ngears++;
+}
+
+
+static void
+free_sphere_gears (ModeInfo *mi)
+{
+  geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+  int i;
+  for (i = 0; i < bp->nshapes; i++)
+    {
+      if (bp->shapes[i].dlist)
+        glDeleteLists (bp->shapes[i].dlist, 1);
+    }
+  free (bp->shapes);
+  bp->nshapes = 0;
+  bp->shapes_size = 0;
+  bp->shapes = 0;
+
+  for (i = 0; i < bp->ngears; i++)
+    {
+      sphere_gear *g = &bp->gears[i];
+      if (g->children)
+        free (g->children);
+      if (g->neighbors)
+        free (g->neighbors);
+    }
+  free (bp->gears);
+  bp->ngears = 0;
+  bp->gears_size = 0;
+  bp->gears = 0;
+}
+
+
+
+/* Is the gear a member of the list?
+ */
+static Bool
+gear_list_member (sphere_gear *g, sphere_gear **list, int count)
+{
+  int i;
+  for (i = 0; i < count; i++)
+    if (list[i] == g) return True;
+  return False;
+}
+
+
+/* Add the gear to the list, resizing it as needed.
+ */
+static void
+gear_list_push (sphere_gear *g,
+                sphere_gear ***listP,
+                int *countP, int *sizeP)
+{
+  if (*countP >= (*sizeP) - 1)
+    {
+      *sizeP = (*sizeP) * 1.2 + 4;
+      *listP = (sphere_gear **) realloc (*listP, (*sizeP) * sizeof(**listP));
+    }
+  (*listP)[*countP] = g;
+  (*countP)++;
+}
+
+
+/* Mark child and parent as being mutual neighbors.
+ */
+static void
+link_neighbors (sphere_gear *parent, sphere_gear *child)
+{
+  if (child == parent) abort();
+
+  /* Add child to parent's list of neighbors */
+  if (! gear_list_member (child, parent->neighbors, parent->nneighbors))
+    {
+      gear_list_push (child,
+                      &parent->neighbors,
+                      &parent->nneighbors,
+                      &parent->neighbors_size);
+      /* fprintf(stderr, "neighbor %2d -> %2d  (%d)\n", parent->id, child->id,
+                parent->nneighbors); */
+    }
+
+  /* Add parent to child's list of neighbors */
+  if (! gear_list_member (parent, child->neighbors, child->nneighbors))
+    {
+      gear_list_push (parent,
+                      &child->neighbors,
+                      &child->nneighbors,
+                      &child->neighbors_size);
+      /* fprintf(stderr, "neighbor %2d <- %2d\n", parent->id, child->id); */
+    }
+}
+
+/* Mark child as having parent, and vice versa.
+ */
+static void
+link_child (sphere_gear *parent, sphere_gear *child)
+{
+  if (child == parent) abort();
+  if (child->parent) return;
+
+  gear_list_push (child,
+                  &parent->children,
+                  &parent->nchildren,
+                  &parent->children_size);
+  child->parent = parent;
+  /* fprintf(stderr, "child    %2d -> %2d  (%d)\n", parent->id, child->id,
+            parent->nchildren); */
+}
+
+
+
+static void link_children (sphere_gear *);
+
+static void
+link_children (sphere_gear *parent)
+{
+  int i;
+# if 1    /* depth first */
+  for (i = 0; i < parent->nneighbors; i++)
+    {
+      sphere_gear *child = parent->neighbors[i];
+      if (! child->parent)
+        {
+          link_child (parent, child);
+          link_children (child);
+        }
+    }
+# else   /* breadth first */
+  for (i = 0; i < parent->nneighbors; i++)
+    {
+      sphere_gear *child = parent->neighbors[i];
+      if (! child->parent)
+        link_child (parent, child);
+    }
+  for (i = 0; i < parent->nchildren; i++)
+    {
+      sphere_gear *child = parent->children[i];
+      link_children (child);
+    }
+# endif
+}
+
+
+
+/* Whether the two gears touch.
+ */
+static Bool
+gears_touch_p (ModeInfo *mi, sphere_gear *a, sphere_gear *b)
+{
+  /* We need to know if the two discs on the surface overlap.
+
+     Find the angle between the axis of each disc, and a point on its edge:
+     the axis between the hypotenuse and adjacent of a right triangle between
+     the disc's radius and the origin.
+
+                     R
+                   _____
+                  |_|  /
+                  |   /
+               1  |  /
+                  |t/    t = asin(R)
+                  |/
+
+     Find the angle between the axes of the two discs.
+
+                 |
+                 |    /    angle = acos (v1 dot v2)
+               1 |   /     axis  = v1 cross v2
+                 |  /  1
+                 | /
+                 |/
+
+     If the sum of the first two angles is less than the third angle,
+     they touch.
+   */
+  XYZ p1 = a->axis;
+  XYZ p2 = b->axis;
+  double t1 = asin (a->g->r);
+  double t2 = asin (b->g->r);
+  double th = acos (dot_product (p1, p2));
+
+  return (t1 + t2 >= th);
+}
+
+
+/* Set the rotation direction for the gear and its kids.
+ */
+static void
+orient_gears (ModeInfo *mi, sphere_gear *g)
+{
+  int i;
+  if (g->parent)
+    g->direction = -g->parent->direction;
+  for (i = 0; i < g->nchildren; i++)
+    orient_gears (mi, g->children[i]);
+}
+
+
+/* Returns the global model coordinates of the given tooth of a gear.
+ */
+static XYZ
+tooth_coords (const sphere_gear *s, int tooth)
+{
+  const gear *g = s->g;
+  GLfloat off = s->offset * (M_PI / 180) * g->ratio * s->direction;
+  GLfloat th = (tooth * M_PI * 2 / g->nteeth) - off;
+  XYZ axis;
+  GLfloat angle;
+  XYZ from = { 0, 1, 0 };
+  XYZ to = s->axis;
+  XYZ p0, p1, p2;
+  GLfloat x, y, z, C, S, m[4][4];
+
+  axis  = cross_product (from, to);
+  angle = acos (dot_product (from, to));
+
+  p0 = normalize (axis);
+  x = p0.x;
+  y = p0.y;
+  z = p0.z;
+  C = cos(angle);
+  S = sin(angle);
+
+  /* this is what glRotatef does */
+  m[0][0] = x*x * (1 - C) + C;
+  m[1][0] = x*y * (1 - C) - z*S;
+  m[2][0] = x*z * (1 - C) + y*S;
+  m[3][0] = 0;
+
+  m[0][1] = y*x * (1 - C) + z*S;
+  m[1][1] = y*y * (1 - C) + C;
+  m[2][1] = y*z * (1 - C) - x*S;
+  m[3][1] = 0;
+
+  m[0][2] = x*z * (1 - C) - y*S;
+  m[1][2] = y*z * (1 - C) + x*S;
+  m[2][2] = z*z * (1 - C) + C;
+  m[3][2] = 0;
+
+  m[0][3] = 0;
+  m[1][3] = 0;
+  m[2][3] = 0;
+  m[3][3] = 1;
+
+  /* The point to transform */
+  p1.x = g->r * sin (th);
+  p1.z = g->r * cos (th);
+  p1.y = 1 - g->z;
+  p1 = normalize (p1);
+
+  /* transformation result */
+  p2.x = p1.x * m[0][0] + p1.y * m[1][0] + p1.z * m[2][0] + m[3][0];
+  p2.y = p1.x * m[0][1] + p1.y * m[1][1] + p1.z * m[2][1] + m[3][1];
+  p2.z = p1.x * m[0][2] + p1.y * m[1][2] + p1.z * m[2][2] + m[3][2];
+
+  return p2;
+}
+
+
+/* Returns the number of the tooth of the first gear that is closest
+   to any tooth of its parent.  Also the position of the parent tooth.
+ */
+static int
+parent_tooth (const sphere_gear *s, XYZ *parent)
+{
+  const sphere_gear *s2 = s->parent;
+  int i, j;
+  GLfloat min_dist = 99999;
+  int min_tooth = 0;
+  XYZ min_parent = { 0, 0, 0 };
+
+  if (s2)
+    for (i = 0; i < s->g->nteeth; i++)
+      {
+        XYZ p1 = tooth_coords (s, i);
+        for (j = 0; j < s2->g->nteeth; j++)
+          {
+            XYZ p2 = tooth_coords (s2, j);
+            XYZ d;
+            GLfloat dist;
+            d.x = p1.x - p2.x;
+            d.y = p1.y - p2.y;
+            d.z = p1.z - p2.z;
+
+            dist = sqrt (d.x*d.x + d.y*d.y + d.z*d.z);
+            if (dist < min_dist)
+              {
+                min_dist = dist;
+                min_parent = p2;
+                min_tooth = i;
+              }
+          }
+      }
+  *parent = min_parent;
+  return min_tooth;
+}
+
+
+/* Make all of the gear's children's teeth mesh properly.
+ */
+static void align_gear_teeth (sphere_gear *s);
+static void
+align_gear_teeth (sphere_gear *s)
+{
+  int i;
+  XYZ pc;
+
+  if (s->parent)
+    {
+      /* Iterate this gear's offset until we find a value for it that
+         minimizes the distance between this gear's parent-pointing
+         tooth, and the corresponding tooth on the parent.
+      */
+      int pt = parent_tooth (s, &pc);
+      GLfloat range = 360 / s->g->nteeth;
+      GLfloat steps = 64;
+      GLfloat min_dist = 999999;
+      GLfloat min_off = 0;
+      GLfloat off;
+
+      for (off = -range/2; off < range/2; off += range/steps)
+        {
+          XYZ tc, d;
+          GLfloat dist;
+          s->offset = off;
+          tc = tooth_coords (s, pt);
+          d.x = pc.x - tc.x;
+          d.y = pc.y - tc.y;
+          d.z = pc.z - tc.z;
+          dist = sqrt (d.x*d.x + d.y*d.y + d.z*d.z);
+          if (dist < min_dist)
+            {
+              min_dist = dist;
+              min_off = off;
+            }
+        }
+
+      s->offset = min_off;
+    }
+
+  /* Now do the children.  We have to do it in parent/child order because
+     the offset we just computed for the parent affects everyone downstream.
+   */
+  for (i = 0; i < s->nchildren; i++)
+    align_gear_teeth (s->children[i]);
+}
+
+
+
+static void
+describe_gears (ModeInfo *mi)
+{
+  geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+  int gears_per_teeth[1000];
+  int i;
+  int lines = 0;
+  memset (gears_per_teeth, 0, sizeof(gears_per_teeth));
+  for (i = 0; i < bp->ngears; i++)
+    gears_per_teeth[bp->gears[i].g->nteeth]++;
+  if (bp->desc) free (bp->desc);
+  bp->desc = (char *) malloc (80 * bp->ngears);
+  *bp->desc = 0;
+  for (i = 0; i < countof(gears_per_teeth); i++)
+    if (gears_per_teeth[i])
+      {
+        sprintf (bp->desc + strlen(bp->desc),
+                 "%s%d gears with %d teeth",
+                 (lines > 0 ? ",\n" : ""),
+                 gears_per_teeth[i], i);
+        lines++;
+      }
+  if (lines > 1)
+    sprintf (bp->desc + strlen(bp->desc), ",\n%d gears total", bp->ngears);
+  strcat (bp->desc, ".");
+}
+
+
+/* Takes the gears and makes an arbitrary DAG of them in order to compute
+   direction and gear ratios.
+ */
+static void
+sort_gears (ModeInfo *mi)
+{
+  geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+  sphere_gear *root = 0;
+  int i, j;
+
+  /* For each gear, compare it against every other gear.
+     If they touch, mark them as being each others' neighbors.
+   */
+  for (i = 0; i < bp->ngears; i++)
+    {
+      sphere_gear *a = &bp->gears[i];
+      for (j = 0; j < bp->ngears; j++)
+        {
+          sphere_gear *b = &bp->gears[j];
+          if (a == b) continue;
+          if (gears_touch_p (mi, a, b))
+            link_neighbors (a, b);
+        }
+    }
+
+  bp->gears[0].parent = &bp->gears[0]; /* don't give this one a parent */
+  link_children (&bp->gears[0]);
+  bp->gears[0].parent = 0;
+
+
+# if 0
+  for (i = 0; i < bp->ngears; i++)
+    {
+      fprintf (stderr, "%2d: p = %2d; k(%d, %d) = ",
+               i,
+               bp->gears[i].parent ? bp->gears[i].parent->id : -1,
+               bp->gears[i].nneighbors,
+               bp->gears[i].nchildren);
+      for (j = 0; j < bp->gears[i].nneighbors; j++)
+        fprintf (stderr, "%2d ", (int) bp->gears[i].neighbors[j]->id);
+      fprintf (stderr, "\t\t");
+      if (j < 5) fprintf (stderr, "\t");
+      for (j = 0; j < bp->gears[i].nchildren; j++)
+        fprintf (stderr, "%2d ", (int) bp->gears[i].children[j]->id);
+      fprintf (stderr,"\n");
+    }
+  fprintf (stderr,"\n");
+# endif /* 0 */
+
+
+  /* If there is more than one gear with no parent, we fucked up. */
+
+  root = 0;
+  for (i = 0; i < bp->ngears; i++)
+    {
+      sphere_gear *g = &bp->gears[i];
+      if (!g->parent)
+        root = g;
+    }
+
+  if (! root) abort();
+
+  root->direction = 1;
+  orient_gears (mi, root);
+
+  /* If there are any gears with no direction, they aren't reachable. */
+  for (i = 0; i < bp->ngears; i++)
+    {
+      sphere_gear *g = &bp->gears[i];
+      if (g->direction == 0)
+        fprintf(stderr,"INTERNAL ERROR: unreachable: %d\n", g->id);
+    }
+
+  align_gear_teeth (root);
+  describe_gears (mi);
+}
+
+
+/* Create 5 identical gears arranged on the faces of a uniform
+   triangular prism.
+ */
+static void
+make_prism (ModeInfo *mi)
+{
+  geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+  gear *g;
+  XYZ a;
+  int i;
+  int teeth = 4 * (4 + (int) (BELLRAND(20)));
+  if (teeth % 4) abort();  /* must be a multiple of 4 */
+
+  g = add_gear_shape (mi, 0.7075, teeth);
+
+  a.x = 0; a.y = 0; a.z = 1;
+  add_sphere_gear (mi, g, a);
+  a.z = -1;
+  add_sphere_gear (mi, g, a);
+
+  a.z = 0;
+  for (i = 0; i < 3; i++)
+    {
+      GLfloat th = i * M_PI * 2 / 3;
+      a.x = cos (th);
+      a.y = sin (th);
+      add_sphere_gear (mi, g, a);
+    }
+
+  if (bp->ngears != 5) abort();
+}
+
+
+/* Create 8 identical gears arranged on the faces of an octohedron
+   (or alternately, arranged on the diagonals of a cube.)
+ */
+static void
+make_octo (ModeInfo *mi)
+{
+  geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+  static const XYZ verts[] = {{ -1, -1, -1 },
+                              { -1, -1,  1 },
+                              { -1,  1,  1 },
+                              { -1,  1, -1 },
+                              {  1, -1,  1 },
+                              {  1, -1, -1 },
+                              {  1,  1, -1 },
+                              {  1,  1,  1 }};
+  gear *g;
+  int i;
+  int teeth = 4 * (4 + (int) (BELLRAND(20)));
+  if (teeth % 4) abort();  /* must be a multiple of 4 */
+
+  g = add_gear_shape (mi, 0.578, teeth);
+  for (i = 0; i < countof(verts); i++)
+    add_sphere_gear (mi, g, verts[i]);
+
+  if (bp->ngears != 8) abort();
+}
+
+
+/* Create 10 identical gears arranged on the faces of ... something.
+   I'm not sure what polyhedron is the basis of this.
+ */
+static void
+make_deca (ModeInfo *mi)
+{
+  geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+  gear *g;
+  XYZ a;
+  int i, j;
+  int teeth = 4 * (4 + (int) (BELLRAND(15)));
+  if (teeth % 4) abort();  /* must be a multiple of 4 */
+
+  g = add_gear_shape (mi, 0.5415, teeth);
+
+  a.x = 0; a.y = 0; a.z = 1;
+  add_sphere_gear (mi, g, a);
+  a.z = -1;
+  add_sphere_gear (mi, g, a);
+
+  for (j = -1; j <= 1; j += 2)
+    {
+      GLfloat off = (j < 0 ? 0 : M_PI / 4);
+      LL v;
+      v.a = j * M_PI * 0.136;  /* #### Empirical. What is this? */
+      for (i = 0; i < 4; i++)
+        {
+          v.o = i * M_PI / 2 + off;
+          a = polar_to_cartesian (v);
+          add_sphere_gear (mi, g, a);
+        }
+    }
+  if (bp->ngears != 10) abort();
+}
+
+
+/* Create 14 identical gears arranged on the faces of ... something.
+   I'm not sure what polyhedron is the basis of this.
+ */
+static void
+make_14 (ModeInfo *mi)
+{
+  geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+  gear *g;
+  XYZ a;
+  int i;
+  GLfloat r = 0.4610;
+  int teeth = 6 * (2 + (int) (BELLRAND(4)));
+  if (teeth % 6) abort();  /* must be a multiple of 6. I think? */
+  /* mismeshes: 24 30 34 36 42 48 54 60 */
+
+  /* North, south */
+  g = add_gear_shape (mi, r, teeth);
+  a.x = 0; a.y = 0; a.z = 1;
+  add_sphere_gear (mi, g, a);
+  a.z = -1;
+  add_sphere_gear (mi, g, a);
+
+  /* Equator */
+  a.z = 0;
+  for (i = 0; i < 4; i++)
+    {
+      GLfloat th = i * M_PI * 2 / 4 + (M_PI / 4);
+      a.x = cos(th);
+      a.y = sin(th);
+      add_sphere_gear (mi, g, a);
+    }
+
+  /* The other 8 */
+  g = add_gear_shape (mi, r, teeth);
+
+  for (i = 0; i < 4; i++)
+    {
+      LL v;
+      v.a = M_PI * 0.197;  /* #### Empirical.  Also, wrong.  What is this? */
+      v.o = i * M_PI * 2 / 4;
+      a = polar_to_cartesian (v);
+      add_sphere_gear (mi, g, a);
+      v.a = -v.a;
+      a = polar_to_cartesian (v);
+      add_sphere_gear (mi, g, a);
+    }
+
+  if (bp->ngears != 14) abort();
+}
+
+
+/* Create 18 identical gears arranged on the faces of ... something.
+   I'm not sure what polyhedron is the basis of this.
+ */
+static void
+make_18 (ModeInfo *mi)
+{
+  geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+  gear *g, *g2;
+  XYZ a;
+  int i;
+  GLfloat r = 0.3830;
+  int sizes[] = { 8, 12, 16, 20 };  /* 10, 14, 18, 26 and 34 don't work */
+  int teeth = sizes[random() % countof(sizes)] * (1 + (random() % 4));
+
+  /* North, south */
+  g = add_gear_shape (mi, r, teeth);
+  a.x = 0; a.y = 0; a.z = 1;
+  add_sphere_gear (mi, g, a);
+  a.z = -1;
+  add_sphere_gear (mi, g, a);
+
+  /* Equator */
+  g2 = add_gear_shape (mi, r, teeth);
+  a.z = 0;
+  for (i = 0; i < 8; i++)
+    {
+      GLfloat th = i * M_PI * 2 / 8 + (M_PI / 4);
+      a.x = cos(th);
+      a.y = sin(th);
+      add_sphere_gear (mi, (i & 1 ? g : g2), a);
+    }
+
+  /* The other 16 */
+  g = add_gear_shape (mi, r, teeth);
+
+  for (i = 0; i < 4; i++)
+    {
+      LL v;
+      v.a = M_PI * 0.25;
+      v.o = i * M_PI * 2 / 4;
+      a = polar_to_cartesian (v);
+      add_sphere_gear (mi, g, a);
+      v.a = -v.a;
+      a = polar_to_cartesian (v);
+      add_sphere_gear (mi, g, a);
+    }
+
+  if (bp->ngears != 18) abort();
+}
+
+
+/* Create 32 gears arranged along a truncated icosahedron:
+   One gear on each of the 20 faces, and one on each of the 12 vertices.
+ */
+static void
+make_32 (ModeInfo *mi, const GLfloat *args)
+{
+  /* http://bugman123.com/Gears/32GearSpheres/ */
+  geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+  GLfloat th0 = atan (0.5);  /* lat division: 26.57 deg */
+  GLfloat s = M_PI / 5;             /* lon division: 72 deg    */
+  int i;
+
+  int teeth1 = args[0];
+  int teeth2 = args[1];
+  GLfloat r1 = args[2];
+  GLfloat ratio = teeth2 / (GLfloat) teeth1;
+  GLfloat r2 = r1 * ratio;
+
+  gear *gear1, *gear2;
+
+  if (teeth1 % 5) abort();
+  if (teeth2 % 6) abort();
+
+  gear1 = add_gear_shape (mi, r1, teeth1);
+  gear2 = add_gear_shape (mi, r2, teeth2);
+  gear2->ratio = 1 / ratio;
+
+  {
+    XYZ a = { 0, 0, 1 };
+    XYZ b = { 0, 0, -1 };
+    add_sphere_gear (mi, gear1, a);
+    add_sphere_gear (mi, gear1, b);
+  }
+
+  for (i = 0; i < 10; i++)
+    {
+      GLfloat th1 = s * i;
+      GLfloat th2 = s * (i+1);
+      GLfloat th3 = s * (i+2);
+      LL v1, v2, v3, vc;
+      XYZ p1, p2, p3, pc, pc2;
+      v1.a = th0;    v1.o = th1;
+      v2.a = th0;    v2.o = th3;
+      v3.a = -th0;   v3.o = th2;
+      vc.a = M_PI/2; vc.o = th2;
+
+      if (! (i & 1)) /* southern hemisphere */
+        {
+          v1.a = -v1.a;
+          v2.a = -v2.a;
+          v3.a = -v3.a;
+          vc.a = -vc.a;
+        }
+
+      p1 = polar_to_cartesian (v1);
+      p2 = polar_to_cartesian (v2);
+      p3 = polar_to_cartesian (v3);
+      pc = polar_to_cartesian (vc);
+
+      /* Two faces: 123 and 12c. */
+
+      add_sphere_gear (mi, gear1, p1); /* left shared point of 2 triangles */
+
+      pc2.x = (p1.x + p2.x + p3.x) / 3;        /* center of bottom triangle */
+      pc2.y = (p1.y + p2.y + p3.y) / 3;
+      pc2.z = (p1.z + p2.z + p3.z) / 3;
+      add_sphere_gear (mi, gear2, pc2);
+
+      pc2.x = (p1.x + p2.x + pc.x) / 3;        /* center of top triangle */
+      pc2.y = (p1.y + p2.y + pc.y) / 3;
+      pc2.z = (p1.z + p2.z + pc.z) / 3;
+      add_sphere_gear (mi, gear2, pc2);
+    }
+
+  if (bp->ngears != 32) abort();
+}
+
+
+/* Create 92 gears arranged along a geodesic sphere: 20 + 12 + 60.
+   (frequency 3v, class-I geodesic tessellation of an icosahedron)
+ */
+static void
+make_92 (ModeInfo *mi, const GLfloat *args)
+{
+  /* http://bugman123.com/Gears/92GearSpheres/ */
+  geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+  GLfloat th0 = atan (0.5);  /* lat division: 26.57 deg */
+  GLfloat s = M_PI / 5;             /* lon division: 72 deg    */
+  int i;
+
+  int tscale = 2;      /* These don't mesh properly, so let's increase the
+                           number of teeth so that it's not so obvious. */
+
+  int teeth1 = args[0] * tscale;
+  int teeth2 = args[1] * tscale;
+  int teeth3 = args[2] * tscale;
+  GLfloat r1 = args[3];
+  GLfloat ratio2 = teeth2 / (GLfloat) teeth1;
+  GLfloat ratio3 = teeth3 / (GLfloat) teeth2;
+  GLfloat r2 = r1 * ratio2;
+  GLfloat r3 = r2 * ratio3;
+
+  GLfloat r4 = args[4];        /* #### Empirical. Not sure what its basis is. */
+  GLfloat r5 = 1 - r4;
+
+  gear *gear1, *gear2, *gear3;
+
+  gear1 = add_gear_shape (mi, r1, teeth1);
+  gear2 = add_gear_shape (mi, r2, teeth2);
+  gear3 = add_gear_shape (mi, r3, teeth3);
+  gear2->ratio = 1 / ratio2;
+  gear3->ratio = 1 / ratio3;
+
+  {
+    XYZ a = { 0, 0, 1 };
+    XYZ b = { 0, 0, -1 };
+    add_sphere_gear (mi, gear1, a);
+    add_sphere_gear (mi, gear1, b);
+  }
+
+  for (i = 0; i < 10; i++)
+    {
+      GLfloat th1 = s * i;
+      GLfloat th2 = s * (i+1);
+      GLfloat th3 = s * (i+2);
+      LL v1, v2, v3, vc;
+      XYZ p1, p2, p3, pc, pc2;
+      v1.a = th0;    v1.o = th1;
+      v2.a = th0;    v2.o = th3;
+      v3.a = -th0;   v3.o = th2;
+      vc.a = M_PI/2; vc.o = th2;
+
+      if (! (i & 1)) /* southern hemisphere */
+        {
+          v1.a = -v1.a;
+          v2.a = -v2.a;
+          v3.a = -v3.a;
+          vc.a = -vc.a;
+        }
+
+      p1 = polar_to_cartesian (v1);
+      p2 = polar_to_cartesian (v2);
+      p3 = polar_to_cartesian (v3);
+      pc = polar_to_cartesian (vc);
+
+      /* Two faces: 123 and 12c. */
+
+      add_sphere_gear (mi, gear1, p1); /* left shared point of 2 triangles */
+
+      pc2.x = (p1.x + p2.x + p3.x) / 3;        /* center of bottom triangle */
+      pc2.y = (p1.y + p2.y + p3.y) / 3;
+      pc2.z = (p1.z + p2.z + p3.z) / 3;
+      add_sphere_gear (mi, gear2, pc2);
+
+      pc2.x = (p1.x + p2.x + pc.x) / 3;        /* center of top triangle */
+      pc2.y = (p1.y + p2.y + pc.y) / 3;
+      pc2.z = (p1.z + p2.z + pc.z) / 3;
+      add_sphere_gear (mi, gear2, pc2);
+
+      /* left edge of bottom triangle, 1/3 in */
+      pc2.x = p1.x + (p3.x - p1.x) * r4;
+      pc2.y = p1.y + (p3.y - p1.y) * r4;
+      pc2.z = p1.z + (p3.z - p1.z) * r4;
+      add_sphere_gear (mi, gear3, pc2);
+
+      /* left edge of bottom triangle, 2/3 in */
+      pc2.x = p1.x + (p3.x - p1.x) * r5;
+      pc2.y = p1.y + (p3.y - p1.y) * r5;
+      pc2.z = p1.z + (p3.z - p1.z) * r5;
+      add_sphere_gear (mi, gear3, pc2);
+
+      /* left edge of top triangle, 1/3 in */
+      pc2.x = p1.x + (pc.x - p1.x) * r4;
+      pc2.y = p1.y + (pc.y - p1.y) * r4;
+      pc2.z = p1.z + (pc.z - p1.z) * r4;
+      add_sphere_gear (mi, gear3, pc2);
+
+      /* left edge of top triangle, 2/3 in */
+      pc2.x = p1.x + (pc.x - p1.x) * r5;
+      pc2.y = p1.y + (pc.y - p1.y) * r5;
+      pc2.z = p1.z + (pc.z - p1.z) * r5;
+      add_sphere_gear (mi, gear3, pc2);
+
+      /* center of shared edge, 1/3 in */
+      pc2.x = p1.x + (p2.x - p1.x) * r4;
+      pc2.y = p1.y + (p2.y - p1.y) * r4;
+      pc2.z = p1.z + (p2.z - p1.z) * r4;
+      add_sphere_gear (mi, gear3, pc2);
+
+      /* center of shared edge, 2/3 in */
+      pc2.x = p1.x + (p2.x - p1.x) * r5;
+      pc2.y = p1.y + (p2.y - p1.y) * r5;
+      pc2.z = p1.z + (p2.z - p1.z) * r5;
+      add_sphere_gear (mi, gear3, pc2);
+    }
+
+  if (bp->ngears != 92) abort();
+}
+
+static void
+make_182 (ModeInfo *mi, const GLfloat *args)
+{
+  /* #### TODO: http://bugman123.com/Gears/182GearSpheres/ */
+  abort();
+}
+
+
+/* Window management, etc
+ */
+ENTRYPOINT void
+reshape_geodesic (ModeInfo *mi, int width, int height)
+{
+  GLfloat h = (GLfloat) height / (GLfloat) width;
+
+  glViewport (0, 0, (GLint) width, (GLint) height);
+
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+  gluLookAt( 0.0, 0.0, 30.0,
+             0.0, 0.0, 0.0,
+             0.0, 1.0, 0.0);
+
+  glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+static void
+pick_shape (ModeInfo *mi, time_t last)
+{
+  geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+  int count = countof (gear_templates);
+
+  if (bp->colors)
+    free (bp->colors);
+
+  bp->ncolors = 1024;
+  bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
+  make_smooth_colormap (0, 0, 0,
+                        bp->colors, &bp->ncolors,
+                        False, 0, False);
+
+  free_sphere_gears (mi);
+
+  if (last == 0)
+    {
+      bp->which = random() % count;
+    }
+  else if (bp->next < 0)
+    {
+      bp->which--;
+      if (bp->which < 0) bp->which = count-1;
+      bp->next = 0;
+    }
+  else if (bp->next > 0)
+    {
+      bp->which++;
+      if (bp->which >= count) bp->which = 0;
+      bp->next = 0;
+    }
+  else
+    {
+      int n = bp->which;
+      while (n == bp->which)
+        n = random() % count;
+      bp->which = n;
+    }
+
+  switch (gear_templates[bp->which].type) {
+  case PRISM: make_prism (mi); break;
+  case OCTO:  make_octo (mi); break;
+  case DECA:  make_deca (mi); break;
+  case G14:   make_14 (mi); break;
+  case G18:   make_18 (mi); break;
+  case G32:   make_32 (mi, gear_templates[bp->which].args); break;
+  case G92:   make_92 (mi, gear_templates[bp->which].args); break;
+  case G182:  make_182(mi, gear_templates[bp->which].args); break;
+  default: abort(); break;
+  }
+
+  sort_gears (mi);
+}
+
+
+
+ENTRYPOINT void 
+init_geodesic (ModeInfo *mi)
+{
+  geodesic_configuration *bp;
+  int wire = MI_IS_WIREFRAME(mi);
+
+  if (!bps) {
+    bps = (geodesic_configuration *)
+      calloc (MI_NUM_SCREENS(mi), sizeof (geodesic_configuration));
+    if (!bps) {
+      fprintf(stderr, "%s: out of memory\n", progname);
+      exit(1);
+    }
+  }
+
+  bp = &bps[MI_SCREEN(mi)];
+
+  bp->glx_context = init_GL(mi);
+
+  reshape_geodesic (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+  {
+    static GLfloat cspec[4] = {1.0, 1.0, 1.0, 1.0};
+    static const GLfloat shiny = 128.0;
+
+    static GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0};
+    static GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0};
+    static GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+    static GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0};
+
+    glLightfv(GL_LIGHT0, GL_POSITION, pos);
+    glLightfv(GL_LIGHT0, GL_AMBIENT,  amb);
+    glLightfv(GL_LIGHT0, GL_DIFFUSE,  dif);
+    glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+
+    glMaterialfv (GL_FRONT, GL_SPECULAR,  cspec);
+    glMateriali  (GL_FRONT, GL_SHININESS, shiny);
+  }
+
+  if (! wire)
+    {
+      glEnable (GL_DEPTH_TEST);
+      glEnable (GL_BLEND);
+      glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+      glEnable (GL_LIGHTING);
+      glEnable (GL_LIGHT0);
+    }
+
+  if (! bp->rot)
+  {
+    double spin_speed   = 0.25 * speed;
+    double wander_speed = 0.01 * speed;
+    double spin_accel   = 0.2;
+
+    bp->rot = make_rotator (do_spin ? spin_speed : 0,
+                            do_spin ? spin_speed : 0,
+                            do_spin ? spin_speed : 0,
+                            spin_accel,
+                            do_wander ? wander_speed : 0,
+                            True);
+    bp->trackball = gltrackball_init (True);
+  }
+
+  bp->font = load_texture_font (MI_DISPLAY(mi), "font");
+
+  pick_shape (mi, 0);
+}
+
+
+ENTRYPOINT Bool
+geodesic_handle_event (ModeInfo *mi, XEvent *event)
+{
+  geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+
+  if (gltrackball_event_handler (event, bp->trackball,
+                                 MI_WIDTH (mi), MI_HEIGHT (mi),
+                                 &bp->button_down_p))
+    return True;
+  else
+    {
+      if (event->xany.type == KeyPress)
+        {
+          KeySym keysym;
+          char c = 0;
+          XLookupString (&event->xkey, &c, 1, &keysym, 0);
+          if (c == '<' || c == ',' || c == '-' || c == '_' ||
+              keysym == XK_Left || keysym == XK_Up || keysym == XK_Prior)
+            {
+              bp->next = -1;
+              goto SWITCH;
+            }
+          else if (c == '>' || c == '.' || c == '=' || c == '+' ||
+                   keysym == XK_Right || keysym == XK_Down ||
+                   keysym == XK_Next)
+            {
+              bp->next = 1;
+              goto SWITCH;
+            }
+        }
+
+      if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+        {
+        SWITCH:
+          bp->mode = 1;
+          bp->mode_tick = 4;
+          return True;
+        }
+    }
+
+  return False;
+}
+
+
+ENTRYPOINT void
+draw_geodesic (ModeInfo *mi)
+{
+  time_t now = time ((time_t *) 0);
+  int wire = MI_IS_WIREFRAME(mi);
+  geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+  Display *dpy = MI_DISPLAY(mi);
+  Window window = MI_WINDOW(mi);
+
+  if (!bp->glx_context)
+    return;
+
+  glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
+
+
+  if (bp->draw_time == 0)
+    {
+      pick_shape (mi, bp->draw_time);
+      bp->draw_time = now;
+    }
+  else if (bp->mode == 0)
+    {
+      if (bp->draw_tick++ > 10)
+        {
+          if (bp->draw_time == 0) bp->draw_time = now;
+          bp->draw_tick = 0;
+
+          if (!bp->button_down_p &&
+              bp->draw_time + timeout <= now)
+            {
+              /* randomize every -timeout seconds */
+              bp->mode = 1;    /* go out */
+              bp->mode_tick = 10 / speed;
+              bp->draw_time = now;
+            }
+        }
+    }
+  else if (bp->mode == 1)   /* out */
+    {
+      if (--bp->mode_tick <= 0)
+        {
+          bp->mode_tick = 10 / speed;
+          bp->mode = 2;  /* go in */
+          pick_shape (mi, bp->draw_time);
+          bp->draw_time = now;
+        }
+    }
+  else if (bp->mode == 2)   /* in */
+    {
+      if (--bp->mode_tick <= 0)
+        bp->mode = 0;  /* normal */
+    }
+  else
+    abort();
+
+
+  if (! wire)
+    glShadeModel(GL_SMOOTH);
+
+  glEnable(GL_DEPTH_TEST);
+  glEnable(GL_NORMALIZE);
+  glEnable(GL_CULL_FACE);
+
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+  glPushMatrix ();
+
+  {
+    double x, y, z;
+    get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+    glTranslatef((x - 0.5) * 8,
+                 (y - 0.5) * 8,
+                 (z - 0.5) * 17);
+
+    gltrackball_rotate (bp->trackball);
+
+    get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p);
+    glRotatef (x * 360, 1.0, 0.0, 0.0);
+    glRotatef (y * 360, 0.0, 1.0, 0.0);
+    glRotatef (z * 360, 0.0, 0.0, 1.0);
+  }
+
+  mi->polygon_count = 0;
+
+  glScalef (6, 6, 6);
+
+  if (bp->ngears < 14)
+    glScalef (0.8, 0.8, 0.8);  /* make these a little easier to see */
+
+  if (bp->mode != 0)
+    {
+      GLfloat s = (bp->mode == 1
+                   ? bp->mode_tick / (10 / speed)
+                   : ((10 / speed) - bp->mode_tick + 1) / (10 / speed));
+      glScalef (s, s, s);
+    }
+
+
+  {
+    int i;
+    for (i = 0; i < bp->ngears; i++)
+      {
+        const sphere_gear *s = &bp->gears[i];
+        const gear *g = s->g;
+
+        XYZ axis;
+        XYZ from = { 0, 1, 0 };
+        XYZ to = s->axis;
+        GLfloat angle;
+        GLfloat off = s->offset;
+
+        /* If an even number of teeth, offset by 1/2 tooth width. */
+        if (s->direction > 0 && !(g->nteeth & 1))
+          off += 360 / g->nteeth / 2;
+
+        axis  = cross_product (from, to);
+        angle = acos (dot_product (from, to));
+
+        glPushMatrix();
+        glTranslatef (to.x, to.y, to.z);
+        glRotatef (angle / M_PI * 180, axis.x, axis.y, axis.z);
+        glRotatef (-90, 1, 0, 0);
+        glRotatef(180, 0, 0, 1);
+        glRotatef ((bp->th - off) * g->ratio * s->direction,
+                   0, 0, 1);
+
+        glCallList (g->dlist);
+        mi->polygon_count += g->polygons;
+        glPopMatrix();
+
+#if 0
+        {                              /* Draw tooth vectors */
+          GLfloat r = 1 - g->z;
+          XYZ pc;
+          int pt = parent_tooth (s, &pc);
+          int t;
+          glDisable(GL_LIGHTING);
+          glLineWidth (8);
+          for (t = 0; t < g->nteeth; t++)
+            {
+              XYZ p = tooth_coords (s, t);
+              XYZ p2;
+              p2.x = (r * s->axis.x + p.x) / 2;
+              p2.y = (r * s->axis.y + p.y) / 2;
+              p2.z = (r * s->axis.z + p.z) / 2;
+
+              if (t == pt)
+                glColor3f(1,0,1);
+              else
+                glColor3f(0,1,1);
+              glBegin(GL_LINES);
+              glVertex3f (p.x, p.y, p.z);
+              glVertex3f (p2.x, p2.y, p2.z);
+              glEnd();
+            }
+          if (!wire) glEnable(GL_LIGHTING);
+          glLineWidth (1);
+        }
+#endif
+
+#if 0
+        {                              /* Draw the parent/child DAG */
+          GLfloat s1 = 1.1;
+          GLfloat s2 = s->parent ? s1 : 1.5;
+          GLfloat s3 = 1.0;
+          XYZ p1 = s->axis;
+          XYZ p2 = s->parent ? s->parent->axis : p1;
+          glDisable(GL_LIGHTING);
+          glColor3f(0,0,1);
+          glBegin(GL_LINES);
+          glVertex3f (s1 * p1.x, s1 * p1.y, s1 * p1.z);
+          glVertex3f (s2 * p2.x, s2 * p2.y, s2 * p2.z);
+          glVertex3f (s1 * p1.x, s1 * p1.y, s1 * p1.z);
+          glVertex3f (s3 * p1.x, s3 * p1.y, s3 * p1.z);
+          glEnd();
+          if (!wire) glEnable(GL_LIGHTING);
+        }
+#endif
+      }
+
+    /* We need to draw the fonts in a second pass in order to make
+       transparency (as a result of anti-aliasing) work properly.
+      */
+    if (do_numbers && bp->mode == 0)
+      for (i = 0; i < bp->ngears; i++)
+        {
+          const sphere_gear *s = &bp->gears[i];
+          const gear *g = s->g;
+
+          XYZ axis;
+          XYZ from = { 0, 1, 0 };
+          XYZ to = s->axis;
+          GLfloat angle;
+          GLfloat off = s->offset;
+
+          int w, h, j;
+          char buf[100];
+
+          /* If an even number of teeth, offset by 1/2 tooth width. */
+          if (s->direction > 0 /* && !(g->nteeth & 1) */)
+            off += 360 / g->nteeth / 2;
+
+          axis  = cross_product (from, to);
+          angle = acos (dot_product (from, to));
+
+          glPushMatrix();
+          glTranslatef(to.x, to.y, to.z);
+          glRotatef (angle / M_PI * 180, axis.x, axis.y, axis.z);
+          glRotatef (-90, 1, 0, 0);
+          glRotatef(180, 0, 0, 1);
+          glRotatef ((bp->th - off) * g->ratio * s->direction,
+                     0, 0, 1);
+
+          glDisable (GL_LIGHTING);
+          glColor3f(1, 1, 0);
+          glPushMatrix();
+          glScalef(0.005, 0.005, 0.005);
+          sprintf (buf, "%d", i);
+          w = texture_string_width (bp->font, buf, &h);
+          glTranslatef (-w/2, -h*2/3, 0);
+          print_texture_string (bp->font, buf);
+          glPopMatrix();
+
+# if 1
+          for (j = 0; j < g->nteeth; j++)          /* Number the teeth */
+            {
+              GLfloat ss = 0.08 * g->r / g->nteeth;
+              GLfloat r = g->r * 0.88;
+              GLfloat th = M_PI - (j * M_PI * 2 / g->nteeth + M_PI/2);
+
+
+              glPushMatrix();
+              glTranslatef (r * cos(th), r * sin(th), -g->z + 0.01);
+              glScalef(ss, ss, ss);
+              sprintf (buf, "%d", j + 1);
+              w = texture_string_width (bp->font, buf, &h);
+              glTranslatef (-w/2, -h*2/3, 0);
+              print_texture_string (bp->font, buf);
+              glPopMatrix();
+            }
+# endif
+          glPopMatrix();
+          if (!wire) glEnable(GL_LIGHTING);
+        }
+
+    bp->th += 0.7 * speed;    /* Don't mod this to 360 - causes glitches. */
+  }
+
+  if (do_labels && bp->mode == 0)
+    {
+      glColor3f (1, 1, 0);
+      print_texture_label (mi->dpy, bp->font,
+                           mi->xgwa.width, mi->xgwa.height,
+                           1, bp->desc);
+    }
+
+  glPopMatrix ();
+
+  if (mi->fps_p) do_fps (mi);
+  glFinish();
+
+  glXSwapBuffers(dpy, window);
+}
+
+ENTRYPOINT void
+release_geodesic (ModeInfo *mi)
+{
+  geodesic_configuration *bp = &bps[MI_SCREEN(mi)];
+  free_texture_font (bp->font);
+  free (bp->colors);
+  free_sphere_gears (mi);
+  if (bp->desc) free (bp->desc);
+}
+
+
+XSCREENSAVER_MODULE_2 ("GeodesicGears", geodesicgears, geodesic)
+
+#endif /* USE_GL */
diff --git a/hacks/glx/geodesicgears.man b/hacks/glx/geodesicgears.man
new file mode 100644 (file)
index 0000000..b15cf90
--- /dev/null
@@ -0,0 +1,78 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+geodesicgears - gears on the surface of a sphere.
+.SH SYNOPSIS
+.B geodesicgears
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-timeout \fInumber\fP]
+[\-labels]
+[\-numbers]
+[\-wireframe]
+[\-wander]
+[\-no-spin]
+[\-fps]
+.SH DESCRIPTION
+A set of meshed gears arranged on the surface of a sphere.  
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 30000 (0.03 seconds).
+.TP 8
+.B \-timeout \fInumber\fP
+Duration before switching to a new model.  5 - 120 seconds.  Default: 20.
+.TP 8
+.B \-labels | \-no-labels
+Whether to show the number of gears and teeth.  Default: no.
+.TP 8
+.B \-numbers | \-no-numbers
+Whether to label the gears with ID numbers.  Default: no.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether the object should spin.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR geodesic (1),
+.BR pinion (1)
+.SH COPYRIGHT
+Copyright \(co 2014 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.
index fead436e35e31122f616a4908d7337462d0420c1..36ff1983daca7773483822ebe53ff5fda1293bd6 100644 (file)
@@ -352,7 +352,7 @@ draw_knot (ModeInfo *mi)
               now - bp->last_time >= duration)
             {
               bp->mode = 1;    /* go out */
-              bp->mode_tick = 10 * speed;
+              bp->mode_tick = 10 / speed;
               bp->last_time = now;
             }
         }
@@ -362,7 +362,7 @@ draw_knot (ModeInfo *mi)
       if (--bp->mode_tick <= 0)
         {
           new_knot (mi);
-          bp->mode_tick = 10 * speed;
+          bp->mode_tick = 10 / speed;
           bp->mode = 2;  /* go in */
         }
     }
@@ -416,8 +416,8 @@ draw_knot (ModeInfo *mi)
   if (bp->mode != 0)
     {
       GLfloat s = (bp->mode == 1
-                   ? bp->mode_tick / (10 * speed)
-                   : ((10 * speed) - bp->mode_tick + 1) / (10 * speed));
+                   ? bp->mode_tick / (10 / speed)
+                   : ((10 / speed) - bp->mode_tick + 1) / (10 / speed));
       glScalef (s, s, s);
     }
 
index f598ff0074294749d7a884dfcd37dd3b674e3a30..1d6326a1769bae3f4aa306b79d76c1c5d2546ec5 100644 (file)
 
 #include <stdlib.h>
 
-#ifndef HAVE_COCOA
+#ifdef HAVE_COCOA
+#elif defined(HAVE_ANDROID)
+# include <GLES/gl.h>
+#else /* real X11 */
 # include <GL/gl.h>
 #endif
 
index 1975182bb336871a7cf5a8149f5ce9b191ff0c11..47069eb36422918159dfff99904cd8d830731043 100644 (file)
@@ -632,6 +632,10 @@ bigendian (void)
 
    If this hack ever grows into something that displays full Latin1 text,
    well then, Something Else Will Need To Be Done.
+
+   Since currently GLMatrix does not run textclient / xscreensaver-text,
+   it's not an issue.  (XMatrix does that.)
+
  */
 static void
 spank_image (matrix_configuration *mp, XImage *xi)
index 1c20b2b996d0dc48f2f63d6368e08a113863a535..8c9dec8fff6ce1342d333d7d5182ceb112dbd567 100644 (file)
@@ -15,6 +15,7 @@
  *
  * Revision History:
  *
+ * 10-Nov-14: jwz@jwz.org   Night map. Better stars.
  * 16-Jan-02: jwz@jwz.org   gdk_pixbuf support.
  * 21-Mar-01: jwz@jwz.org   Broke sphere routine out into its own file.
  *
  *
  * 8-Oct-98: Released initial version of "glplanet"
  * (David Konerding, dek@cgl.ucsf.edu)
- *
- * BUGS:
- * -bounce is broken
- * 
- *   For even more spectacular results, grab the images from the "SSystem"
- *   package (http://www.msu.edu/user/kamelkev/) and use its JPEGs!
  */
 
 
 #define DEF_SPIN    "0.03"
 #define DEF_TEXTURE "True"
 #define DEF_STARS   "True"
-#define DEF_LIGHT   "True"
 #define DEF_RESOLUTION "128"
 #define DEF_IMAGE   "BUILTIN"
 
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
+#undef BELLRAND
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+
 static int do_rotate;
 static int do_roll;
 static int do_wander;
 static int do_texture;
 static int do_stars;
-static int do_light;
 static char *which_image;
 static int resolution;
-static float star_spin;
 
 static XrmOptionDescRec opts[] = {
   {"-rotate",  ".glplanet.rotate",  XrmoptionNoArg, "true" },
@@ -94,8 +89,6 @@ static XrmOptionDescRec opts[] = {
   {"-stars",   ".glplanet.stars",   XrmoptionNoArg, "true" },
   {"+stars",   ".glplanet.stars",   XrmoptionNoArg, "false" },
   {"-spin",    ".glplanet.spin",    XrmoptionSepArg, 0 },
-  {"-light",   ".glplanet.light",   XrmoptionNoArg, "true" },
-  {"+light",   ".glplanet.light",   XrmoptionNoArg, "false" },
   {"-image",   ".glplanet.image",  XrmoptionSepArg, 0 },
   {"-resolution", ".glplanet.resolution", XrmoptionSepArg, 0 },
 };
@@ -106,10 +99,8 @@ static argtype vars[] = {
   {&do_wander,   "wander",  "Wander",  DEF_WANDER,  t_Bool},
   {&do_texture,  "texture", "Texture", DEF_TEXTURE, t_Bool},
   {&do_stars,    "stars",   "Stars",   DEF_STARS,   t_Bool},
-  {&do_light,    "light",   "Light",   DEF_LIGHT,   t_Bool},
   {&which_image, "image",   "Image",   DEF_IMAGE,   t_String},
   {&resolution,  "resolution","Resolution", DEF_RESOLUTION, t_Int},
-  {&star_spin,   "spin",    "Float",   DEF_SPIN,    t_Float},
 };
 
 ENTRYPOINT ModeSpecOpt planet_opts = {countof(opts), opts, countof(vars), vars, NULL};
@@ -128,6 +119,7 @@ ModStruct   planet_description =
                     the following XPM file... */
 # endif
 #include "../images/earth.xpm"
+#include "../images/earth_night.xpm"
 
 #include "xpm-ximage.h"
 #include "rotator.h"
@@ -140,31 +132,25 @@ ModStruct   planet_description =
  * at the expense of rendering speed
  */
 
-#define NUM_STARS 1000
-
-/* radius of the sphere- fairly arbitrary */
-#define RADIUS 4
-
-/* distance away from the sphere model */
-#define DIST 40
-
-
-
 /* structure for holding the planet data */
 typedef struct {
   GLuint platelist;
+  GLuint shadowlist;
   GLuint latlonglist;
   GLuint starlist;
+  int starcount;
   int screen_width, screen_height;
   GLXContext *glx_context;
   Window window;
   XColor fg, bg;
-  GLfloat sunpos[4];
-  double z;
+  GLfloat z;
+  GLfloat tilt;
   rotator *rot;
   trackball_state *trackball;
-  double star_theta;
   Bool button_down_p;
+  GLuint tex1, tex2;
+  int draw_axis;
+
 } planetstruct;
 
 
@@ -234,16 +220,25 @@ setup_file_texture (ModeInfo *mi, char *filename)
 static void
 setup_texture(ModeInfo * mi)
 {
-/*  planetstruct *gp = &planets[MI_SCREEN(mi)];*/
-
-  glEnable(GL_TEXTURE_2D);
+  planetstruct *gp = &planets[MI_SCREEN(mi)];
 
   if (!which_image ||
          !*which_image ||
          !strcmp(which_image, "BUILTIN"))
-       setup_xpm_texture (mi, earth_xpm);
+    {
+      glGenTextures (1, &gp->tex1);
+      glBindTexture (GL_TEXTURE_2D, gp->tex1);
+      setup_xpm_texture (mi, earth_xpm);
+      glGenTextures (1, &gp->tex2);
+      glBindTexture (GL_TEXTURE_2D, gp->tex2);
+      setup_xpm_texture (mi, earth_night_xpm);
+    }
   else
-       setup_file_texture (mi, which_image);
+    {
+      glGenTextures (1, &gp->tex1);
+      glBindTexture (GL_TEXTURE_2D, gp->tex1);
+      setup_file_texture (mi, which_image);
+    }
 
   check_gl_error("texture initialization");
 
@@ -262,27 +257,36 @@ init_stars (ModeInfo *mi)
   int width  = MI_WIDTH(mi);
   int height = MI_HEIGHT(mi);
   int size = (width > height ? width : height);
-  int nstars = size * size / 320;
+  int nstars = size * size / 80;
   int max_size = 3;
   GLfloat inc = 0.5;
   int steps = max_size / inc;
 
   gp->starlist = glGenLists(1);
   glNewList(gp->starlist, GL_COMPILE);
-
-  glEnable(GL_POINT_SMOOTH);
-
   for (j = 1; j <= steps; j++)
     {
       glPointSize(inc * j);
       glBegin (GL_POINTS);
       for (i = 0; i < nstars / steps; i++)
         {
-          glColor3f (0.6 + frand(0.3),
-                     0.6 + frand(0.3),
-                     0.6 + frand(0.3));
-          glVertex2f (2 * size * (0.5 - frand(1.0)),
-                      2 * size * (0.5 - frand(1.0)));
+          GLfloat d = 0.1;
+          GLfloat r = 0.15 + frand(0.3);
+          GLfloat g = r + frand(d) - d;
+          GLfloat b = r + frand(d) - d;
+
+          GLfloat x = frand(1)-0.5;
+          GLfloat y = frand(1)-0.5;
+          GLfloat z = ((random() & 1)
+                       ? frand(1)-0.5
+                       : (BELLRAND(1)-0.5)/12);   /* milky way */
+          d = sqrt (x*x + y*y + z*z);
+          x /= d;
+          y /= d;
+          z /= d;
+          glColor3f (r, g, b);
+          glVertex3f (x, y, z);
+          gp->starcount++;
         }
       glEnd ();
     }
@@ -292,93 +296,6 @@ init_stars (ModeInfo *mi)
 }
 
 
-static void
-draw_stars (ModeInfo *mi)
-{
-  planetstruct *gp = &planets[MI_SCREEN(mi)];
-  
-  glDisable(GL_TEXTURE_2D);
-  glDisable(GL_LIGHTING);
-  glDisable(GL_DEPTH_TEST);
-
-  glMatrixMode (GL_PROJECTION);
-  glPushMatrix ();
-  {
-    glLoadIdentity ();
-
-    glMatrixMode (GL_MODELVIEW);
-    glPushMatrix ();
-    {
-      glLoadIdentity ();
-      glOrtho (-0.5 * MI_WIDTH(mi),  0.5 * MI_WIDTH(mi),
-               -0.5 * MI_HEIGHT(mi), 0.5 * MI_HEIGHT(mi),
-               -100.0, 100.0);
-      glRotatef (gp->star_theta, 0.0, 0.0, 1.0);
-      glCallList (gp->starlist);
-    }
-    glPopMatrix ();
-  }
-  glMatrixMode (GL_PROJECTION);
-  glPopMatrix ();
-
-  glMatrixMode (GL_MODELVIEW);
-}
-
-
-
-/* Set up lighting */
-static void
-init_sun (ModeInfo * mi)
-{
-  planetstruct *gp = &planets[MI_SCREEN(mi)];
-
-  GLfloat lamb[4] = { 0.1, 0.1, 0.1, 1.0 };
-  GLfloat ldif[4] = { 1.0, 1.0, 1.0, 1.0 };
-  GLfloat spec[4] = { 1.0, 1.0, 1.0, 1.0 };
-
-  GLfloat mamb[4] = { 0.5, 0.5, 0.5, 1.0 };
-  GLfloat mdif[4] = { 1.0, 1.0, 1.0, 1.0 };
-  GLfloat mpec[4] = { 1.0, 1.0, 1.0, 1.0 };
-  GLfloat shiny = .4;
-
-  {
-    double h =  0.1 + frand(0.8);   /* east-west position - screen-side. */
-    double v = -0.3 + frand(0.6);   /* north-south position */
-
-    if (h > 0.3 && h < 0.8)         /* avoid having the sun at the camera */
-      h += (h > 0.5 ? 0.2 : -0.2);
-
-    gp->sunpos[0] = cos(h * M_PI);
-    gp->sunpos[1] = sin(h * M_PI);
-    gp->sunpos[2] = sin(v * M_PI);
-    gp->sunpos[3] =  0.00;
-  }
-
-  glEnable(GL_LIGHTING);
-  glEnable(GL_LIGHT0);
-
-  glLightfv (GL_LIGHT0, GL_POSITION, gp->sunpos);
-  glLightfv (GL_LIGHT0, GL_AMBIENT,  lamb);
-  glLightfv (GL_LIGHT0, GL_DIFFUSE,  ldif);
-  glLightfv (GL_LIGHT0, GL_SPECULAR, spec);
-
-  check_gl_error("sun");
-  glMaterialfv (GL_FRONT, GL_AMBIENT,  mamb);
-  glMaterialfv (GL_FRONT, GL_DIFFUSE,  mdif);
-  glMaterialfv (GL_FRONT, GL_SPECULAR, mpec);
-  glMaterialf  (GL_FRONT, GL_SHININESS, shiny);
-
-
-/*  glEnable(GL_BLEND);*/
-/*  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);*/
-  glShadeModel(GL_SMOOTH);
-
-  check_gl_error("lighting");
-}
-
-
-#define RANDSIGN() ((random() & 1) ? 1 : -1)
-
 ENTRYPOINT void
 reshape_planet (ModeInfo *mi, int width, int height)
 {
@@ -390,7 +307,7 @@ reshape_planet (ModeInfo *mi, int width, int height)
   glFrustum(-1.0, 1.0, -h, h, 5.0, 100.0);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
-  glTranslatef(0.0, 0.0, -DIST);
+  glTranslatef(0.0, 0.0, -40);
 
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 }
@@ -458,46 +375,42 @@ init_planet (ModeInfo * mi)
   }
 
   {
-    double spin_speed   = 0.5;
-    double wander_speed = 0.02;
+    double spin_speed   = 0.1;
+    double wander_speed = 0.005;
     gp->rot = make_rotator (do_roll ? spin_speed : 0,
                             do_roll ? spin_speed : 0,
                             0, 1,
                             do_wander ? wander_speed : 0,
                             True);
     gp->z = frand (1.0);
+    gp->tilt = frand (23.4);
     gp->trackball = gltrackball_init (True);
   }
 
   if (wire)
-    {
-      do_texture = False;
-      do_light = False;
-    }
+    do_texture = False;
 
   if (do_texture)
     setup_texture (mi);
 
-  if (do_light)
-       init_sun (mi);
-
   if (do_stars)
     init_stars (mi);
 
-  if (random() & 1)
-    star_spin = -star_spin;
-
   /* construct the polygons of the planet
    */
   gp->platelist = glGenLists(1);
   glNewList (gp->platelist, GL_COMPILE);
-  glColor3f (1,1,1);
-  glPushMatrix ();
-  glScalef (RADIUS, RADIUS, RADIUS);
-  glRotatef (90, 1, 0, 0);
   glFrontFace(GL_CCW);
+  glPushMatrix();
+  glRotatef (90, 1, 0, 0);
   unit_sphere (resolution, resolution, wire);
-  glPopMatrix ();
+  glPopMatrix();
+  glEndList();
+
+  gp->shadowlist = glGenLists(1);
+  glNewList (gp->shadowlist, GL_COMPILE);
+  glFrontFace(GL_CCW);
+  unit_dome (resolution, resolution, wire);
   glEndList();
 
   /* construct the polygons of the latitude/longitude/axis lines.
@@ -505,12 +418,6 @@ init_planet (ModeInfo * mi)
   gp->latlonglist = glGenLists(1);
   glNewList (gp->latlonglist, GL_COMPILE);
   glPushMatrix ();
-  glDisable (GL_TEXTURE_2D);
-  glDisable (GL_LIGHTING);
-  glDisable (GL_LINE_SMOOTH);
-  glColor3f (0.1, 0.3, 0.1);
-  glScalef (RADIUS, RADIUS, RADIUS);
-  glScalef (1.01, 1.01, 1.01);
   glRotatef (90, 1, 0, 0);
   unit_sphere (12, 24, 1);
   glBegin(GL_LINES);
@@ -521,12 +428,14 @@ init_planet (ModeInfo * mi)
   glEndList();
 }
 
+
 ENTRYPOINT void
 draw_planet (ModeInfo * mi)
 {
   planetstruct *gp = &planets[MI_SCREEN(mi)];
-  Display    *display = MI_DISPLAY(mi);
-  Window      window = MI_WINDOW(mi);
+  int wire = MI_IS_WIREFRAME(mi);
+  Display *dpy = MI_DISPLAY(mi);
+  Window window = MI_WINDOW(mi);
   double x, y, z;
 
   if (!gp->glx_context)
@@ -535,20 +444,23 @@ draw_planet (ModeInfo * mi)
   glDrawBuffer(GL_BACK);
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
-  glXMakeCurrent (display, window, *(gp->glx_context));
+  glXMakeCurrent (dpy, window, *(gp->glx_context));
 
   mi->polygon_count = 0;
 
-  if (do_stars)
+  if (gp->button_down_p)
+    gp->draw_axis = 60;
+  else if (!gp->draw_axis && !(random() % 1000))
+    gp->draw_axis = 60 + (random() % 90);
+
+  if (do_rotate && !gp->button_down_p)
     {
-      draw_stars (mi);
-      mi->polygon_count += NUM_STARS;
+      gp->z -= 0.001;     /* the sun sets in the west */
+      if (gp->z < 0) gp->z += 1;
     }
 
-  if (do_light)   glEnable(GL_LIGHTING);
-  if (do_texture) glEnable(GL_TEXTURE_2D);
-
-  glEnable (GL_LINE_SMOOTH);
+  glEnable(GL_LINE_SMOOTH);
+  glEnable(GL_POINT_SMOOTH);
   glEnable(GL_DEPTH_TEST);
   glEnable(GL_CULL_FACE);
   glCullFace(GL_BACK); 
@@ -556,45 +468,133 @@ draw_planet (ModeInfo * mi)
   glPushMatrix();
 
   get_position (gp->rot, &x, &y, &z, !gp->button_down_p);
-  glTranslatef((x - 0.5) * 15,
-               (y - 0.5) * 15,
-               (z - 0.5) * 8);
+  x = (x - 0.5) * 6;
+  y = (y - 0.5) * 6;
+  z = (z - 0.5) * 3;
+  glTranslatef(x, y, z);
 
   gltrackball_rotate (gp->trackball);
 
-  glRotatef (90,1,0,0);
-
   if (do_roll)
     {
       get_rotation (gp->rot, &x, &y, 0, !gp->button_down_p);
       glRotatef (x * 360, 1.0, 0.0, 0.0);
       glRotatef (y * 360, 0.0, 1.0, 0.0);
     }
+  else
+    glRotatef (current_device_rotation(), 0, 0, 1);
+
+  if (do_stars)
+    {
+      glDisable(GL_TEXTURE_2D);
+      glPushMatrix();
+      glTranslatef(-x, -y, -z);
+      glScalef (40, 40, 40);
+      glRotatef (90, 1, 0, 0);
+      glRotatef (35, 1, 0, 0);
+      glCallList (gp->starlist);
+      mi->polygon_count += gp->starcount;
+      glPopMatrix();
+      glClear(GL_DEPTH_BUFFER_BIT);
+    }
 
-  glLightfv (GL_LIGHT0, GL_POSITION, gp->sunpos);
+  glRotatef (90, 1, 0, 0);
+  glRotatef (35, 1, 0, 0);
+  glRotatef (10, 0, 1, 0);
+  glRotatef (120, 0, 0, 1);
 
-  glRotatef (gp->z * 360, 0.0, 0.0, 1.0);
-  if (do_rotate && !gp->button_down_p)
+  glScalef (3, 3, 3);
+
+# ifdef USE_IPHONE
+  glScalef (2, 2, 2);
+# endif
+
+  if (wire)
+    glColor3f (0.5, 0.5, 1);
+  else
+    glColor3f (1, 1, 1);
+
+  if (do_texture)
     {
-      gp->z -= 0.005;     /* the sun sets in the west */
-      if (gp->z < 0) gp->z += 1;
+      glEnable(GL_TEXTURE_2D);
+      glBindTexture (GL_TEXTURE_2D, gp->tex1);
     }
 
+  glPushMatrix();
+  glRotatef (gp->z * 360, 0, 0, 1);
   glCallList (gp->platelist);
   mi->polygon_count += resolution*resolution;
+  glPopMatrix();
 
-  if (gp->button_down_p)
+  /* Originally we just used GL_LIGHT0 to produce the day/night sides of
+     the planet, but that always looked crappy, even with a vast number of
+     polygons, because the day/night terminator didn't exactly line up with
+     the polygon edges.
+
+     So instead, draw the full "day" sphere; clear the depth buffer; draw
+     a rotated/tilted half-sphere into the depth buffer only; then draw
+     the "night" sphere.  That lets us divide the sphere into the two maps,
+     and the dividing line can be at any angle, regardless of polygon layout.
+
+     The half-sphere is scaled slightly larger to avoid polygon fighting,
+     since those triangles won't exactly line up because of the rotation.
+
+     The downside of this is that the day/night terminator is 100% sharp.
+     It would be nice if it was a little blurry.
+   */
+
+  if (wire)
     {
+      glPushMatrix();
+      glRotatef (gp->tilt, 1, 0, 0);
+      glColor3f(0, 0, 0);
+      glLineWidth(4);
+      glCallList (gp->shadowlist);
+      glLineWidth(1);
+      mi->polygon_count += resolution*(resolution/2);
+      glPopMatrix();
+    }
+  else if (do_texture && gp->tex2)
+    {
+      glClear(GL_DEPTH_BUFFER_BIT);
+      glDisable(GL_TEXTURE_2D);
+      glColorMask (0, 0, 0, 0);
+      glPushMatrix();
+      glRotatef (gp->tilt, 1, 0, 0);
+      glScalef (1.01, 1.01, 1.01);
+      glCallList (gp->shadowlist);
+      mi->polygon_count += resolution*(resolution/2);
+      glPopMatrix();
+      glColorMask (1, 1, 1, 1);
+      glEnable(GL_TEXTURE_2D);
+
+      glBindTexture (GL_TEXTURE_2D, gp->tex2);
+      glPushMatrix();
+      glRotatef (gp->z * 360, 0, 0, 1);
+      glCallList (gp->platelist);
+      mi->polygon_count += resolution*resolution;
+      glPopMatrix();
+    }
+
+  if (gp->draw_axis)
+    {
+      glPushMatrix();
+      glRotatef (gp->z * 360, 0.0, 0.0, 1.0);
+      glScalef (1.02, 1.02, 1.02);
+      glDisable (GL_TEXTURE_2D);
+      glDisable (GL_LIGHTING);
+      glDisable (GL_LINE_SMOOTH);
+      glColor3f (0.1, 0.3, 0.1);
       glCallList (gp->latlonglist);
       mi->polygon_count += 24*24;
+      glPopMatrix();
+      if (gp->draw_axis) gp->draw_axis--;
     }
   glPopMatrix();
 
   if (mi->fps_p) do_fps (mi);
   glFinish();
-  glXSwapBuffers(display, window);
-
-  gp->star_theta += star_spin;
+  glXSwapBuffers(dpy, window);
 }
 
 
index a01358ee068153d76aa6bca956c88778cb527f92..44e48db12975ee97b2cf8b3bc19f20426c010e5a 100644 (file)
@@ -7,7 +7,6 @@ glplanet - rotating 3d texture-mapped planet.
 [\-visual \fIvisual\fP]
 [\-window]
 [\-root]
-[\-no-light]
 [\-delay \fInumber\fP]
 [\-image \fIfile\fP]
 [\-resolution \fInumber\fP]
@@ -29,9 +28,6 @@ Draw on a newly-created window.  This is the default.
 .B \-root
 Draw on the root window.
 .TP 8
-.B \-light | \-no-light
-Use Flat Coloring.
-.TP 8
 .B \-delay \fInumber\fP
 Per-frame delay, in microseconds.  Default: 20000 (0.02 seconds.).
 .TP 8
index bf5f87d22428cbb761a29bf450b899404af1391c..992d75cbbea974029b05b8ec1ba7c9e6dff40338 100644 (file)
@@ -73,7 +73,7 @@
                   "*showFPS:         False                \n" \
                  "*fpsSolid:        True                 \n" \
                  "*useSHM:          True                 \n" \
-                 "*titleFont:       -*-helvetica-medium-r-normal-*-180-*\n" \
+            "*titleFont: -*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*\n" \
                   "*desktopGrabber:  xscreensaver-getimage -no-desktop %s\n" \
                  "*grabDesktopImages:   False \n" \
                  "*chooseRandomImages:  True  \n"
@@ -99,7 +99,7 @@
 # define DEF_MIPMAP         "True"
 
 #include "grab-ximage.h"
-#include "glxfonts.h"
+#include "texfont.h"
 
 typedef struct {
   double x, y, w, h;
@@ -806,19 +806,13 @@ draw_sprite (ModeInfo *mi, sprite *sp)
 
 
     if (do_titles &&
-        img->title && *img->title)
+        img->title && *img->title &&
+        (sp->state == IN || sp->state == FULL))
       {
-        int x = 10;
-        int y = mi->xgwa.height - 10;
-        glColor4f (0, 0, 0, sp->opacity);   /* cheap-assed dropshadow */
-        print_gl_string (mi->dpy, ss->font_data,
-                         mi->xgwa.width, mi->xgwa.height, x, y,
-                         img->title, False);
-        x++; y++;
         glColor4f (1, 1, 1, sp->opacity);
-        print_gl_string (mi->dpy, ss->font_data,
-                         mi->xgwa.width, mi->xgwa.height, x, y,
-                         img->title, False);
+        print_texture_label (mi->dpy, ss->font_data,
+                             mi->xgwa.width, mi->xgwa.height,
+                             1, img->title);
       }
   }
   glPopMatrix();
index 2117a93889529911070e23ae08ac47baca399dd6..094b12a0c4fd0459d1417c26529d7986c98b54b5 100644 (file)
@@ -149,15 +149,14 @@ static GLfloat angvel;
 #define DEFAULTS "*delay:          30000                      \n" \
                  "*count:          30                         \n" \
                  "*showFPS:        False                      \n" \
-                 "*labelfont:   -*-helvetica-medium-r-normal-*-180-*\n" \
-
+         "*labelfont:   -*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*\n" \
 
 
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
 #include "xlockmore.h"
-#include "glxfonts.h"
+#include "texfont.h"
 
 static XrmOptionDescRec opts[] = {
     { "-explode", ".explode", XrmoptionSepArg, DEF_EXPLODE },
@@ -1733,10 +1732,9 @@ static void draw_title(
                glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, s[i++]);
        }
 #else
-       print_gl_string(mi->dpy, bp->font_data,
-                        mi->xgwa.width, mi->xgwa.height,
-                       10.0, (float) mi->xgwa.height - 10.0,
-                       s, False);
+       print_texture_label (mi->dpy, bp->font_data,
+                             mi->xgwa.width, mi->xgwa.height,
+                             1, s);
 #endif
     }
     glPopMatrix();
index 8f96e79a1d3bb37a8a8471fd1c08f87fcc02b969..bc7e81bf6c27aedfb25d2f6c450b38e911713393 100644 (file)
@@ -34,6 +34,7 @@
 #include "rotator.h"
 #include "gltrackball.h"
 #include "textclient.h"
+#include "utf8wc.h"
 
 #include <ctype.h>
 
@@ -151,43 +152,15 @@ gl_init (ModeInfo *mi)
 }
 
 
-/* The GLUT font only has ASCII characters in them, so do what we can to
-   convert Latin1 characters to the nearest ASCII equivalent... 
- */
-static void
-latin1_to_ascii (char *s)
-{
-  unsigned char *us = (unsigned char *) s;
-  const unsigned char ascii[95] = {
-    '!', 'C', '#', '#', 'Y', '|', 'S', '_', 'C', '?', '<', '=', '-', 'R', '_',
-    '?', '?', '2', '3', '\'','u', 'P', '.', ',', '1', 'o', '>', '?', '?', '?',
-    '?', 'A', 'A', 'A', 'A', 'A', 'A', 'E', 'C', 'E', 'E', 'E', 'E', 'I', 'I',
-    'I', 'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'x', '0', 'U', 'U', 'U', 'U',
-    'Y', 'p', 'S', 'a', 'a', 'a', 'a', 'a', 'a', 'e', 'c', 'e', 'e', 'e', 'e',
-    'i', 'i', 'i', 'i', 'o', 'n', 'o', 'o', 'o', 'o', 'o', '/', 'o', 'u', 'u',
-    'u', 'u', 'y', 'p', 'y' };
-  while (*us)
-    {
-      if (*us >= 161)
-        *us = ascii[*us - 161];
-      else if (*us > 127)
-        *us = '?';
-      us++;
-    }
-}
-
-
 static void
 parse_text (ModeInfo *mi)
 {
   text_configuration *tp = &tps[MI_SCREEN(mi)];
-
-  if (tp->text) free (tp->text);
-  tp->text = 0;
+  char *old = tp->text;
 
   if (program_str && *program_str && !!strcmp(program_str, "(default)"))
     {
-      int max_lines = 20;
+      int max_lines = 8;
       char buf[1024];
       char *p = buf;
       int lines = 0;
@@ -211,7 +184,11 @@ parse_text (ModeInfo *mi)
         lines++;
 
       tp->text = strdup (buf);
-      tp->reload = 1;
+      
+      tp->reload = 7;  /* Let this one linger for a few seconds */
+      if (!*tp->text)
+        tp->reload = 1;
+
     }
   else if (!text_fmt || !*text_fmt || !strcmp(text_fmt, "(default)"))
     {
@@ -297,7 +274,23 @@ parse_text (ModeInfo *mi)
       tp->reload = 1;
     }
 
-  latin1_to_ascii (tp->text);
+  {
+    /* The GLUT font only has ASCII characters. */
+    char *s1 = utf8_to_latin1 (tp->text, True);
+    free (tp->text);
+    tp->text = s1;
+  }
+
+  /* If we had text before but got no text this time, hold on to the
+     old one, to avoid flickering.
+   */
+  if (old && *old && !*tp->text)
+    {
+      free (tp->text);
+      tp->text = old;
+    }
+  else if (old)
+    free (old);
 }
 
 
index 0af1d0a3c2a024ba81cd3fc38a913a2907a49636..3ab2265b4b549cfb593fbe28521dbbf34d991506 100644 (file)
@@ -68,8 +68,12 @@ for more details.
 .B \-program \fIcommand\fP
 The given program is run, and its output is displayed.
 If specified, this overrides \fI\-text\fP.
-The program will be re-run every 5 seconds to re-generate the text.
-It should run quickly, and shouldn't generate too much text.
+The output of this program will be repeatedely displayed, with new
+pages of text shifting in every few seconds.  Lines should be relatively
+short.  You might try:
+.EX
+-program 'xscreensaver-text --cols 20'
+.EE
 .TP 8
 .B \-wander
 Move the text around the screen.  This is the default.
@@ -110,8 +114,9 @@ stored in the RESOURCE_MANAGER property.
 .SH SEE ALSO
 .BR X (1),
 .BR xscreensaver (1)
+.BR xscreensaver-text (1)
 .SH COPYRIGHT
-Copyright \(co 2001-2005 by Jamie Zawinski.
+Copyright \(co 2001-2014 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
index f3e02fd34f10d741682dc857b48bfe911b5d6ff9..f07cb7cddb94cbd3b1a414143c55d635be017fd3 100644 (file)
 
 #ifdef HAVE_COCOA
 # include "jwxyz.h"
-#else  /* !HAVE_COCOA -- real X11 */
+#elif defined(HAVE_ANDROID)
+# include "jwxyz.h"
+# include <GLES/gl.h>
+#else  /* real X11 */
 # include <X11/X.h>
 # include <X11/Xlib.h>
 # include <GL/gl.h>
@@ -73,7 +76,11 @@ gltrackball_init (int ignore_device_rotation_p)
 void
 gltrackball_reset (trackball_state *ts)
 {
+  int bd = ts->button_down_p;
+  int ig = ts->ignore_device_rotation_p;
   memset (ts, 0, sizeof(*ts));
+  ts->button_down_p = bd;
+  ts->ignore_device_rotation_p = ig;
   trackball (ts->q, 0, 0, 0, 0);
 }
 
diff --git a/hacks/glx/glxfonts.c b/hacks/glx/glxfonts.c
deleted file mode 100644 (file)
index 1519006..0000000
+++ /dev/null
@@ -1,237 +0,0 @@
-/* glxfonts, Copyright (c) 2001-2014 Jamie Zawinski <jwz@jwz.org>
- *
- * 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.
- *
- * Draws 2D text over the GL scene, e.g., the FPS displays.
- * Also billboarding.
- * The lower-level character rendering code is in texfont.c.
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <ctype.h>
-
-#ifdef HAVE_COCOA
-# include "jwxyz.h"
-/*# include <AGL/agl.h>*/
-#else
-# include <GL/glx.h>
-# include <GL/glu.h>
-#endif
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
-
-#include "resources.h"
-#include "glxfonts.h"
-#include "texfont.h"
-#include "fps.h"
-
-
-/* These are in xlock-gl.c */
-extern void clear_gl_error (void);
-extern void check_gl_error (const char *type);
-
-/* screenhack.h */
-extern char *progname;
-
-
-#undef DEBUG  /* Defining this causes check_gl_error() to be called inside
-                 time-critical sections, which could slow things down (since
-                 it might result in a round-trip, and stall of the pipeline.)
-               */
-
-#undef countof
-#define countof(x) (sizeof((x))/sizeof((*x)))
-
-
-/* Draws the string on the window at the given pixel position.
-   Newlines and tab stops are honored.
-   Any numbers inside [] will be rendered as a subscript.
-   Assumes the font has been loaded as with load_texture_font().
-
-   If width and height are 0, then instead the text is placed
-   into the 3D scene at the origin, billboarded to face the
-   viewer.
- */
-void
-print_gl_string (Display *dpy,
-                 texture_font_data *data,
-                 int window_width, int window_height,
-                 GLfloat x, GLfloat y,
-                 const char *string,
-                 Bool clear_background_p)
-{
-  Bool in_scene_p = (window_width == 0);
-
-  int line_height = 0;
-  int lines = 0;
-  const char *c;
-  GLfloat color[4];
-
-  Bool tex_p   = glIsEnabled (GL_TEXTURE_2D);
-  Bool texs_p  = glIsEnabled (GL_TEXTURE_GEN_S);
-  Bool text_p  = glIsEnabled (GL_TEXTURE_GEN_T);
-  Bool light_p = glIsEnabled (GL_LIGHTING);
-  Bool blend_p = glIsEnabled (GL_BLEND);
-  Bool depth_p = glIsEnabled (GL_DEPTH_TEST);
-  Bool cull_p  = glIsEnabled (GL_CULL_FACE);
-  Bool fog_p   = glIsEnabled (GL_FOG);
-  GLint oblend;
-  GLint ovp[4];
-
-#  ifndef HAVE_JWZGLES
-  GLint opoly[2];
-  glGetIntegerv (GL_POLYGON_MODE, opoly);
-#  endif
-
-  if (!in_scene_p)
-    glGetIntegerv (GL_VIEWPORT, ovp);
-
-  glGetIntegerv (GL_BLEND_DST, &oblend);
-  glGetFloatv (GL_CURRENT_COLOR, color);
-
-  for (c = string; *c; c++)
-    if (*c == '\n') lines++;
-
-  texture_string_width (data, "m", &line_height);
-  y -= line_height;
-
-
-  glEnable (GL_TEXTURE_2D);
-  glEnable (GL_BLEND);
-  glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-  glPolygonMode (GL_FRONT, GL_FILL);
-
-  glDisable (GL_TEXTURE_GEN_S);
-  glDisable (GL_TEXTURE_GEN_T);
-  glDisable (GL_LIGHTING);
-  glDisable (GL_CULL_FACE);
-  glDisable (GL_FOG);
-
-  if (!in_scene_p)
-    glDisable (GL_DEPTH_TEST);
-
-  /* Each matrix mode has its own stack, so we need to push/pop
-     them separately.
-   */
-  glMatrixMode(GL_PROJECTION);
-  glPushMatrix();
-  {
-# ifdef DEBUG
-    check_gl_error ("glPushMatrix");
-# endif
-    if (!in_scene_p)
-      glLoadIdentity();
-
-    glMatrixMode(GL_MODELVIEW);
-    glPushMatrix();
-    {
-# ifdef DEBUG
-      check_gl_error ("glPushMatrix");
-# endif
-
-      if (!in_scene_p)
-        {
-          int rot = (int) current_device_rotation();
-          while (rot <= -180) rot += 360;
-          while (rot >   180) rot -= 360;
-
-          glLoadIdentity();
-          glViewport (0, 0, window_width, window_height);
-          glOrtho (0, window_width, 0, window_height, -1, 1);
-
-          if (rot > 135 || rot < -135)         /* 180 */
-            {
-              glTranslatef (window_width, window_height, 0);
-              glRotatef (180, 0, 0, 1);
-            }
-          else if (rot > 45)                   /* 90 */
-            {
-              glTranslatef (window_width, 0, 0);
-              glRotatef (90, 0, 0, 1);
-            }
-          else if (rot < -45)                  /* 270 */
-            {
-              glTranslatef(0, window_height, 0);
-              glRotatef (-90, 0, 0, 1);
-            }
-        }
-
-# ifdef DEBUG
-      check_gl_error ("glOrtho");
-# endif
-
-      /* Let's always dropshadow the FPS and Title text. */
-      if (! in_scene_p)
-        clear_background_p = True;
-
-
-      /* draw the text */
-
-      glTranslatef (x, y, 0);
-
-      {
-        const XPoint offsets[] = {{ -1, -1 },
-                                  { -1,  1 },
-                                  {  1,  1 },
-                                  {  1, -1 },
-                                  {  0,  0 }};
-        int i;
-
-        glColor3f (0, 0, 0);
-        for (i = 0; i < countof(offsets); i++)
-          {
-            if (! clear_background_p)
-              i = countof(offsets)-1;
-            if (offsets[i].x == 0)
-              glColor4fv (color);
-
-            glPushMatrix();
-            glTranslatef (offsets[i].x, offsets[i].y, 0);
-            print_texture_string (data, string);
-            glPopMatrix();
-          }
-      }
-
-# ifdef DEBUG
-      check_gl_error ("print_texture_string");
-# endif
-    }
-    glPopMatrix();
-  }
-  glMatrixMode(GL_PROJECTION);
-  glPopMatrix();
-
-  if (tex_p)   glEnable (GL_TEXTURE_2D); else glDisable (GL_TEXTURE_2D);
-  if (texs_p)  glEnable (GL_TEXTURE_GEN_S);/*else glDisable(GL_TEXTURE_GEN_S);*/
-  if (text_p)  glEnable (GL_TEXTURE_GEN_T);/*else glDisable(GL_TEXTURE_GEN_T);*/
-  if (blend_p) glEnable (GL_BLEND); else glDisable (GL_BLEND);
-  if (light_p) glEnable (GL_LIGHTING); /*else glDisable (GL_LIGHTING);*/
-  if (depth_p) glEnable (GL_DEPTH_TEST); else glDisable (GL_DEPTH_TEST);
-  if (cull_p)  glEnable (GL_CULL_FACE); /*else glDisable (GL_CULL_FACE);*/
-  if (fog_p)   glEnable (GL_FOG); /*else glDisable (GL_FOG);*/
-
-  if (!in_scene_p)
-    glViewport (ovp[0], ovp[1], ovp[2], ovp[3]);
-
-  glBlendFunc (GL_SRC_ALPHA, oblend);
-
-# ifndef HAVE_JWZGLES
-  glPolygonMode (GL_FRONT, opoly[0]);
-# endif
-
-  glMatrixMode(GL_MODELVIEW);
-}
diff --git a/hacks/glx/glxfonts.h b/hacks/glx/glxfonts.h
deleted file mode 100644 (file)
index 5c793fe..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/* glxfonts, Copyright (c) 2001-2014 Jamie Zawinski <jwz@jwz.org>
- * Loads X11 fonts for use with OpenGL.
- *
- * 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.
- *
- * Loads X11 fonts for use with OpenGL.
- */
-
-#ifndef __GLXFONTS_H__
-#define __GLXFONTS_H__
-
-#include "texfont.h"
-
-/* Draws the string on the window at the given pixel position.
-   Newlines and tab stops are honored.
-   Any numbers inside [] will be rendered as a subscript.
-   Assumes the font has been loaded as with load_texture_font().
-
-   If width and height are 0, then instead the text is placed
-   into the 3D scene at the origin, billboarded to face the
-   viewer.
- */
-void print_gl_string (Display *dpy,
-                      texture_font_data *font,
-                      int window_width, int window_height,
-                      GLfloat x, GLfloat y,
-                      const char *string,
-                      Bool clear_background_p);
-
-#endif /* __GLXFONTS_H__ */
index a7c415e96c171072115abe8941fb7bf301340858..5ad8a95fa24d6ab0db90c9b5595103ebfffe8465 100644 (file)
@@ -1,4 +1,4 @@
-/* involute, Copyright (c) 2004-2007 Jamie Zawinski <jwz@jwz.org>
+/* involute, Copyright (c) 2004-2014 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -43,13 +43,16 @@ static Bool show_normals_p = False;
  */
 static int
 draw_ring (int segments,
-           GLfloat r, GLfloat top, GLfloat bottom, 
+           GLfloat r, GLfloat top, GLfloat bottom, GLfloat slope,
            Bool in_p, Bool wire_p)
 {
   int i;
   int polys = 0;
   GLfloat width = M_PI * 2 / segments;
 
+  GLfloat s1 = 1 + ((bottom-top) * slope / 2);
+  GLfloat s2 = 1 - ((bottom-top) * slope / 2);
+
   if (top != bottom)
     {
       glFrontFace (in_p ? GL_CCW : GL_CW);
@@ -63,8 +66,8 @@ draw_ring (int segments,
             glNormal3f (-cth, -sth, 0);
           else
             glNormal3f (cth, sth, 0);
-          glVertex3f (cth * r, sth * r, top);
-          glVertex3f (cth * r, sth * r, bottom);
+          glVertex3f (s1 * cth * r, s1 * sth * r, top);
+          glVertex3f (s2 * cth * r, s2 * sth * r, bottom);
         }
       polys += segments;
       glEnd();
@@ -143,7 +146,7 @@ draw_disc (int segments,
  */
 static int
 draw_spokes (int n, GLfloat thickness, int segments,
-             GLfloat ra, GLfloat rb, GLfloat z1, GLfloat z2,
+             GLfloat ra, GLfloat rb, GLfloat z1, GLfloat z2, GLfloat slope,
              Bool wire_p)
 {
   int i;
@@ -154,6 +157,9 @@ draw_spokes (int n, GLfloat thickness, int segments,
   int tick;
   int state;
 
+  GLfloat s1 = 1 + ((z2-z1) * slope / 2);
+  GLfloat s2 = 1 - ((z2-z1) * slope / 2);
+
   if (ra <= 0 || rb <= 0) abort();
 
   segments *= 3;
@@ -196,10 +202,10 @@ draw_spokes (int n, GLfloat thickness, int segments,
           glFrontFace (GL_CCW);
           glBegin (wire_p ? GL_LINES : GL_QUADS);
           glNormal3f (0, 0, -1);
-          glVertex3f (cth1 * ra, sth1 * ra, z1);
-          glVertex3f (cth1 * rb, sth1 * rb, z1);
-          glVertex3f (cth2 * rb, sth2 * rb, z1);
-          glVertex3f (cth2 * ra, sth2 * ra, z1);
+          glVertex3f (s1 * cth1 * ra, s1 * sth1 * ra, z1);
+          glVertex3f (s1 * cth1 * rb, s1 * sth1 * rb, z1);
+          glVertex3f (s1 * cth2 * rb, s1 * sth2 * rb, z1);
+          glVertex3f (s1 * cth2 * ra, s1 * sth2 * ra, z1);
           polys++;
           glEnd();
 
@@ -207,10 +213,10 @@ draw_spokes (int n, GLfloat thickness, int segments,
           glFrontFace (GL_CW);
           glBegin (wire_p ? GL_LINES : GL_QUADS);
           glNormal3f (0, 0, 1);
-          glVertex3f (cth1 * ra, sth1 * ra, z2);
-          glVertex3f (cth1 * rb, sth1 * rb, z2);
-          glVertex3f (cth2 * rb, sth2 * rb, z2);
-          glVertex3f (cth2 * ra, sth2 * ra, z2);
+          glVertex3f (s2 * cth1 * ra, s2 * sth1 * ra, z2);
+          glVertex3f (s2 * cth1 * rb, s2 * sth1 * rb, z2);
+          glVertex3f (s2 * cth2 * rb, s2 * sth2 * rb, z2);
+          glVertex3f (s2 * cth2 * ra, s2 * sth2 * ra, z2);
           polys++;
           glEnd();
         }
@@ -220,13 +226,13 @@ draw_spokes (int n, GLfloat thickness, int segments,
           /* left */
           glFrontFace (GL_CW);
           glBegin (wire_p ? GL_LINES : GL_QUADS);
-          do_normal (cth1 * rb, sth1 * rb, z1,
-                     cth1 * ra, sth1 * ra, z1,
-                     cth1 * rb, sth1 * rb, z2);
-          glVertex3f (cth1 * ra, sth1 * ra, z1);
-          glVertex3f (cth1 * rb, sth1 * rb, z1);
-          glVertex3f (cth1 * rb, sth1 * rb, z2);
-          glVertex3f (cth1 * ra, sth1 * ra, z2);
+          do_normal (s1 * cth1 * rb, s1 * sth1 * rb, z1,
+                     s1 * cth1 * ra, s1 * sth1 * ra, z1,
+                     s2 * cth1 * rb, s2 * sth1 * rb, z2);
+          glVertex3f (s1 * cth1 * ra, s1 * sth1 * ra, z1);
+          glVertex3f (s1 * cth1 * rb, s1 * sth1 * rb, z1);
+          glVertex3f (s2 * cth1 * rb, s2 * sth1 * rb, z2);
+          glVertex3f (s2 * cth1 * ra, s2 * sth1 * ra, z2);
           polys++;
           glEnd();
         }
@@ -236,13 +242,13 @@ draw_spokes (int n, GLfloat thickness, int segments,
           /* right */
           glFrontFace (GL_CCW);
           glBegin (wire_p ? GL_LINES : GL_QUADS);
-          do_normal (cth2 * ra, sth2 * ra, z1,
-                     cth2 * rb, sth2 * rb, z1,
-                     cth2 * rb, sth2 * rb, z2);
-          glVertex3f (cth2 * ra, sth2 * ra, z1);
-          glVertex3f (cth2 * rb, sth2 * rb, z1);
-          glVertex3f (cth2 * rb, sth2 * rb, z2);
-          glVertex3f (cth2 * ra, sth2 * ra, z2);
+          do_normal (s1 * cth2 * ra, s1 * sth2 * ra, z1,
+                     s1 * cth2 * rb, s1 * sth2 * rb, z1,
+                     s2 * cth2 * rb, s2 * sth2 * rb, z2);
+          glVertex3f (s1 * cth2 * ra, s1 * sth2 * ra, z1);
+          glVertex3f (s1 * cth2 * rb, s1 * sth2 * rb, z1);
+          glVertex3f (s2 * cth2 * rb, s2 * sth2 * rb, z2);
+          glVertex3f (s2 * cth2 * ra, s2 * sth2 * ra, z2);
           polys++;
           glEnd();
         }
@@ -260,7 +266,7 @@ draw_gear_nubs (gear *g, Bool wire_p)
 {
   int polys = 0;
   int i;
-  int steps = (g->size != INVOLUTE_LARGE ? 5 : 20);
+  int steps = (g->size < INVOLUTE_LARGE ? 5 : 20);
   double r, size, height;
   GLfloat *cc;
   int which;
@@ -298,13 +304,13 @@ draw_gear_nubs (gear *g, Bool wire_p)
         }
 
       if (wire_p && !wire_all_p)
-        polys += draw_ring ((g->size == INVOLUTE_LARGE ? steps/2 : steps),
-                            size, 0, 0, False, wire_p);
+        polys += draw_ring ((g->size >= INVOLUTE_LARGE ? steps/2 : steps),
+                            size, 0, 0, 0, False, wire_p);
       else
         {
           polys += draw_disc (steps, 0, size, -height,      True,  wire_p);
           polys += draw_disc (steps, 0, size,  height,      False, wire_p);
-          polys += draw_ring (steps, size, -height, height, False, wire_p);
+          polys += draw_ring (steps, size, -height, height, 0, False, wire_p);
         }
       glPopMatrix();
     }
@@ -360,8 +366,8 @@ draw_gear_interior (gear *g, Bool wire_p)
 
   int steps = g->nteeth * 2;
   if (steps < 10) steps = 10;
-  if ((wire_p && !wire_all_p) || g->size != INVOLUTE_LARGE) steps /= 2;
-  if (g->size != INVOLUTE_LARGE && steps > 16) steps = 16;
+  if ((wire_p && !wire_all_p) || g->size < INVOLUTE_LARGE) steps /= 2;
+  if (g->size < INVOLUTE_LARGE && steps > 16) steps = 16;
 
   /* ring 1 (facing in) is done in draw_gear_teeth */
 
@@ -373,27 +379,29 @@ draw_gear_interior (gear *g, Bool wire_p)
       GLfloat rb = g->inner_r2;        /*  since the points don't line up */
       GLfloat za = -g->thickness2/2;
       GLfloat zb =  g->thickness2/2;
+      GLfloat s1 = 1 + (g->thickness2 * g->tooth_slope / 2);
+      GLfloat s2 = 1 - (g->thickness2 * g->tooth_slope / 2);
 
       glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, g->color2);
 
       if ((g->coax_p != 1 && !g->inner_r3) ||
           (wire_p && wire_all_p))
-        polys += 
-          draw_ring (steps, rb, za, zb, True, wire_p);  /* ring facing in*/
+        polys +=   /* ring facing in */
+          draw_ring (steps, rb, za, zb, g->tooth_slope, True, wire_p);
 
       if (wire_p && wire_all_p)
-        polys += 
-          draw_ring (steps, ra, za, zb, True, wire_p);  /* ring facing in*/
+        polys +=  /* ring facing in */
+          draw_ring (steps, ra, za, zb, g->tooth_slope, True, wire_p);
 
       if (g->spokes)
         polys += draw_spokes (g->spokes, g->spoke_thickness,
-                              steps, ra, rb, za, zb, wire_p);
+                              steps, ra, rb, za, zb, g->tooth_slope, wire_p);
       else if (!wire_p || wire_all_p)
         {
-          polys += 
-            draw_disc (steps, ra, rb, za, True, wire_p);  /* top plate */
-          polys += 
-            draw_disc (steps, ra, rb, zb, False, wire_p); /* bottom plate*/
+          polys +=   /* top plate */
+            draw_disc (steps, s1*ra, s1*rb, za, True, wire_p);
+          polys +=   /* bottom plate */
+            draw_disc (steps, s2*ra, s2*rb, zb, False, wire_p);
         }
     }
 
@@ -405,22 +413,24 @@ draw_gear_interior (gear *g, Bool wire_p)
       GLfloat rb = g->inner_r3;
       GLfloat za = -g->thickness3/2;
       GLfloat zb =  g->thickness3/2;
+      GLfloat s1 = 1 + (g->thickness3 * g->tooth_slope / 2);
+      GLfloat s2 = 1 - (g->thickness3 * g->tooth_slope / 2);
 
       glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, g->color);
 
-      polys += 
-        draw_ring (steps, ra, za, zb, False, wire_p);  /* ring facing out */
+      polys +=   /* ring facing out */
+        draw_ring (steps, ra, za, zb, g->tooth_slope, False, wire_p);
 
       if (g->coax_p != 1 || (wire_p && wire_all_p))
-        polys +=
-          draw_ring (steps, rb, za, zb, True, wire_p);  /* ring facing in */
+        polys += /* ring facing in */
+          draw_ring (steps, rb, za, zb, g->tooth_slope, True, wire_p);
 
       if (!wire_p || wire_all_p)
         {
-          polys += 
-            draw_disc (steps, ra, rb, za, True, wire_p);  /* top plate */
-          polys += 
-            draw_disc (steps, ra, rb, zb, False, wire_p); /* bottom plate */
+          polys +=   /* top plate */
+            draw_disc (steps, s1*ra, s1*rb, za, True, wire_p);
+          polys +=  /* bottom plate */
+            draw_disc (steps, s2*ra, s2*rb, zb, False, wire_p);
         }
     }
 
@@ -441,14 +451,14 @@ draw_gear_interior (gear *g, Bool wire_p)
       if (wire_p && !wire_all_p) steps /= 2;
 
       polys += 
-        draw_ring (steps, ra, za, zb, False, wire_p);  /* ring facing out */
+        draw_ring (steps, ra, za, zb, g->tooth_slope, False, wire_p);
 
       if (!wire_p || wire_all_p)
         {
           polys += 
             draw_disc (steps, 0,  ra, za, True, wire_p);  /* top plate */
-          polys
-            += draw_disc (steps, 0,  ra, zb, False, wire_p); /* bottom plate */
+          polys +=
+            draw_disc (steps, 0,  ra, zb, False, wire_p); /* bottom plate */
         }
     }
   return polys;
@@ -526,7 +536,7 @@ gear_teeth_geometry (gear *g,
                      tooth_face *irim)      /* inner rim (the hole)  */
 {
   int i;
-  int ppt = 9;   /* max points per tooth */
+  int ppt = 20;   /* max points per tooth */
   GLfloat width = M_PI * 2 / g->nteeth;
   GLfloat rh = g->tooth_h;
   GLfloat tw = width;
@@ -534,50 +544,64 @@ gear_teeth_geometry (gear *g,
   /* Approximate shape of an "involute" gear tooth.
 
                                  (TH)
-                 th0 th1 th2 th3 th4 th5 th6 th7 th8   th9    th10
+                 th0 th2 th4 th6 th8 t10 t12 t14 th16  th18   th20
                    :  :  :   :    :    :   :  :  :      :      :
                    :  :  :   :    :    :   :  :  :      :      :
         r0 ........:..:..:...___________...:..:..:......:......:..
                    :  :  :  /:    :    :\  :  :  :      :      :
                    :  :  : / :    :    : \ :  :  :      :      :
                    :  :  :/  :    :    :  \:  :  :      :      :
-        r1 ........:.....@...:....:....:...@..:..:......:......:..
+        r2 ........:.....@...:....:....:...@..:..:......:......:..
                    :  : @:   :    :    :   :@ :  :      :      :
     (R) ...........:...@.:...:....:....:...:.@..........:......:......
                    :  :@ :   :    :    :   : @:  :      :      :
-        r2 ........:..@..:...:....:....:...:..@:........:......:..
+        r4 ........:..@..:...:....:....:...:..@:........:......:..
                    : /:  :   :    :    :   :  :\ :      :      :
                    :/ :  :   :    :    :   :  : \:      :      : /
-        r3 ......__/..:..:...:....:....:...:..:..\______________/
+        r6 ......__/..:..:...:....:....:...:..:..\______________/
                    :  :  :   :    :    :   :  :  :      :      :
                    |  :  :   :    :    :   :  :  |      :      :
                    :  :  :   :    :    :   :  :  :      :      :
                    |  :  :   :    :    :   :  :  |      :      :
-        r4 ......__:_____________________________:________________
+        r8 ......__:_____________________________:________________
    */
 
-  GLfloat r[20];
-  GLfloat th[20];
+  GLfloat r[30];
+  GLfloat th[30];
   GLfloat R = g->r;
 
-  r[0] = R + (rh * 0.5);
-  r[1] = R + (rh * 0.25);
-  r[2] = R - (r[1]-R);
-  r[3] = R - (r[0]-R);
-  r[4] = g->inner_r;
-
-  th[0] = -tw * (g->size == INVOLUTE_SMALL ? 0.5 : 
-                 g->size == INVOLUTE_MEDIUM ? 0.41 : 0.45);
-  th[1] = -tw * 0.30;
-  th[2] = -tw * (g->nteeth >= 5 ? 0.16 : 0.12);
-  th[3] = -tw * (g->size == INVOLUTE_MEDIUM ? 0.1 : 0.04);
-  th[4] =  0;
-  th[5] =  -th[3];
-  th[6] =  -th[2];
-  th[7] =  -th[1];
-  th[8] =  -th[0];
-  th[9] =  width / 2;
-  th[10]=  th[0] + width;
+  r[0] = R + (rh * 0.50);
+  r[1] = R + (rh * 0.40);
+  r[2] = R + (rh * 0.25);
+  r[3] = R + (rh * 0.05);
+  r[4] = R - (r[2]-R);
+  r[5] = R - (r[1]-R);
+  r[6] = R - (r[0]-R);
+  r[7] = r[6]; /* unused */
+  r[8] = g->inner_r;
+
+  th[0]  = -tw * (g->size == INVOLUTE_SMALL ? 0.5 : 
+                  g->size == INVOLUTE_MEDIUM ? 0.41 : 0.45);
+  th[1]  = -tw * 0.375;
+  th[2]  = -tw * 0.300;
+  th[3]  = -tw * 0.230;
+  th[4]  = -tw * (g->nteeth >= 5 ? 0.16 : 0.12);
+  th[5]  = -tw * 0.100;
+  th[6]  = -tw * (g->size == INVOLUTE_MEDIUM ? 0.1 : 0.04);
+  th[7]  = -tw * 0.020;
+  th[8]  =  0;
+  th[9]  = -th[7];
+  th[10] = -th[6];
+  th[11] = -th[5];
+  th[12] = -th[4];
+  th[13] = -th[3];
+  th[14] = -th[2];
+  th[15] = -th[1];
+  th[16] = -th[0];
+  th[17] =  width * 0.47;
+  th[18] =  width * 0.50;
+  th[19] =  width * 0.53;
+  th[20] =  th[0] + width; /* unused */
 
   if (g->inverted_p)   /* put the teeth on the inside */
     {
@@ -587,23 +611,6 @@ gear_teeth_geometry (gear *g,
         r[i] = R - (r[i] - R);
     }
 
-#if 0
-  if (g->inverted_p)   /* put the teeth on the inside */
-    {
-      GLfloat swap[countof(th)];
-
-      for (i = 0; i < maxr; i++)
-        swap[maxr-i-1] = R - (r[i] - R);
-      for (i = 0; i < maxr; i++)
-        r[i] = swap[i];
-
-      for (i = 0; i < maxth; i++)
-        swap[maxth-i-1] = -th[i];
-      for (i = 0; i < maxth; i++)
-        th[i] = swap[i];
-    }
-#endif
-
   orim->npoints  = 0;
   orim->points   = (XYZ *) calloc(ppt * g->nteeth+1, sizeof(*orim->points));
   orim->fnormals = (XYZ *) calloc(ppt * g->nteeth+1, sizeof(*orim->fnormals));
@@ -638,32 +645,51 @@ gear_teeth_geometry (gear *g,
         irim->points[irim->npoints].y = sin(TH+th[(PTH)]) * r[(IPR)]; \
         irim->npoints++
 
-      if (g->size == INVOLUTE_SMALL)
-        {
-          PUSH(3, 4, 0);       /* tooth left 1 */
-          PUSH(0, 4, 4);       /* tooth top middle */
-        }
-      else if (g->size == INVOLUTE_MEDIUM)
-        {
-          PUSH(3, 4, 0);       /* tooth left 1 */
-          PUSH(0, 4, 3);       /* tooth top left */
-          PUSH(0, 4, 5);       /* tooth top right */
-          PUSH(3, 4, 8);       /* tooth right 3 */
-        }
-      else if (g->size == INVOLUTE_LARGE)
-        {
-          PUSH(3, 4, 0);       /* tooth left 1 */
-          PUSH(2, 4, 1);       /* tooth left 2 */
-          PUSH(1, 4, 2);       /* tooth left 3 */
-          PUSH(0, 4, 3);       /* tooth top left */
-          PUSH(0, 4, 5);       /* tooth top right */
-          PUSH(1, 4, 6);       /* tooth right 1 */
-          PUSH(2, 4, 7);       /* tooth right 2 */
-          PUSH(3, 4, 8);       /* tooth right 3 */
-          PUSH(3, 4, 9);       /* gap top */
-        }
-      else
+      switch (g->size) {
+      case INVOLUTE_SMALL:
+        PUSH(6, 8, 0);       /* tooth left 1 */
+        PUSH(0, 8, 8);       /* tooth top middle */
+        break;
+      case INVOLUTE_MEDIUM:
+        PUSH(6, 8, 0);       /* tooth left 1 */
+        PUSH(0, 8, 6);       /* tooth top left */
+        PUSH(0, 8, 10);      /* tooth top right */
+        PUSH(6, 8, 16);      /* tooth right 6 */
+        break;
+      case INVOLUTE_LARGE:
+        PUSH(6, 8, 0);       /* tooth left 1 */
+        PUSH(4, 8, 2);       /* tooth left 3 */
+        PUSH(2, 8, 4);       /* tooth left 5 */
+        PUSH(0, 8, 6);       /* tooth top left */
+        PUSH(0, 8, 10);      /* tooth top right */
+        PUSH(2, 8, 12);      /* tooth right 1 */
+        PUSH(4, 8, 14);      /* tooth right 3 */
+        PUSH(6, 8, 16);      /* tooth right 5 */
+        PUSH(6, 8, 18);      /* gap top */
+        break;
+      case INVOLUTE_HUGE:
+        PUSH(6, 8, 0);       /* tooth left 1 */
+        PUSH(5, 8, 1);       /* tooth left 2 */
+        PUSH(4, 8, 2);       /* tooth left 3 */
+        PUSH(3, 8, 3);       /* tooth left 4 */
+        PUSH(2, 8, 4);       /* tooth left 5 */
+        PUSH(1, 8, 5);       /* tooth left 6 */
+        PUSH(0, 8, 6);       /* tooth top left */
+        PUSH(0, 8, 8);       /* tooth top left */
+        PUSH(0, 8, 10);      /* tooth top right */
+        PUSH(1, 8, 11);      /* tooth top right */
+        PUSH(2, 8, 12);      /* tooth right 1 */
+        PUSH(3, 8, 13);      /* tooth right 2 */
+        PUSH(4, 8, 14);      /* tooth right 3 */
+        PUSH(5, 8, 15);      /* tooth right 4 */
+        PUSH(6, 8, 16);      /* tooth right 5 */
+        PUSH(6, 8, 17);      /* tooth right 6 */
+        PUSH(6, 8, 18);      /* gap top */
+        PUSH(6, 8, 19);      /* gap top */
+        break;
+      default:
         abort();
+      }
 #     undef PUSH
 
       if (i == 0 && orim->npoints > ppt) abort();  /* go update "ppt"! */
@@ -793,7 +819,7 @@ draw_gear_teeth (gear *g, Bool wire_p)
       glVertex3f (s2*orim.points[i].x, s2*orim.points[i].y, z2);
 
       /* Show the face normal vectors */
-      if (wire_p && show_normals_p)
+      if (0&&wire_p && show_normals_p)
         {
           XYZ n = orim.fnormals[i];
           int a = i;
@@ -847,8 +873,8 @@ draw_gear_teeth (gear *g, Bool wire_p)
   for (i = 0; i < irim.npoints; i++)
     {
       glNormal3f(-irim.pnormals[i].x, -irim.pnormals[i].y,-irim.pnormals[i].z);
-      glVertex3f (irim.points[i].x, irim.points[i].y, z1);
-      glVertex3f (irim.points[i].x, irim.points[i].y, z2);
+      glVertex3f (s1*irim.points[i].x, s1*irim.points[i].y, z1);
+      glVertex3f (s2*irim.points[i].x, s2*irim.points[i].y, z2);
 
       /* Show the face normal vectors */
       if (wire_p && show_normals_p)
@@ -878,8 +904,8 @@ draw_gear_teeth (gear *g, Bool wire_p)
   if (!wire_p)  /* close the quad loop */
     {
       glNormal3f (-irim.pnormals[0].x,-irim.pnormals[0].y,-irim.pnormals[0].z);
-      glVertex3f (irim.points[0].x, irim.points[0].y, z1);
-      glVertex3f (irim.points[0].x, irim.points[0].y, z2);
+      glVertex3f (s1*irim.points[0].x, s1*irim.points[0].y, z1);
+      glVertex3f (s2*irim.points[0].x, s2*irim.points[0].y, z2);
     }
   polys += irim.npoints;
   glEnd();
@@ -913,12 +939,12 @@ draw_gear_teeth (gear *g, Bool wire_p)
           for (i = 0; i < orim.npoints; i++)
             {
               glVertex3f (s*orim.points[i].x, s*orim.points[i].y, z);
-              glVertex3f (  irim.points[i].x,   irim.points[i].y, z);
+              glVertex3f (s*irim.points[i].x, s*irim.points[i].y, z);
             }
           if (!wire_p)  /* close the quad loop */
             {
               glVertex3f (s*orim.points[0].x, s*orim.points[0].y, z);
-              glVertex3f (  irim.points[0].x,   irim.points[0].y, z);
+              glVertex3f (s*irim.points[0].x, s*irim.points[0].y, z);
             }
           polys += orim.npoints;
           glEnd();
index 341444253041d2f02e1bfd7b7e34d003569d1345..c6a3066b88fa97986e81346e994220fb6169d435 100644 (file)
@@ -1,4 +1,4 @@
-/* involute, Copyright (c) 2004-2007 Jamie Zawinski <jwz@jwz.org>
+/* involute, Copyright (c) 2004-2014 Jamie Zawinski <jwz@jwz.org>
  *
  * 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 @@ typedef struct {
 
   enum { INVOLUTE_SMALL, 
          INVOLUTE_MEDIUM, 
-         INVOLUTE_LARGE } size;        /* Controls complexity of mesh. */
+         INVOLUTE_LARGE, 
+         INVOLUTE_HUGE } size; /* Controls complexity of mesh. */
   GLfloat color[4];
   GLfloat color2[4];
 
index c7448361ca79bd8035550fc28fd67b64573f8fdf..cde122aa4e01db91484af1234ac7d70fafee453e 100644 (file)
@@ -48,7 +48,7 @@
 #define DEF_WOBBLE       "True"
 #define DEF_DEBUG        "False"
 
-#define DEF_FONT "-*-helvetica-bold-r-normal-*-240-*"
+#define DEF_FONT "-*-helvetica-bold-r-normal-*-*-240-*-*-*-*-*-*"
 #define DEFAULTS  "*delay:             20000   \n" \
                  "*showFPS:            False   \n" \
                  "*font:            " DEF_FONT"\n" \
index f6b5ce7850377f958dc7f28db597ea757571d0a9..fe2b93681aaadacf5be522c25aa32e80a4790afc 100644 (file)
                        "*count:        200     \n" \
                        "*cycles:       1000    \n" \
                        "*ncolors:      32      \n" \
-                        "*titleFont:  -*-helvetica-bold-r-normal-*-180-*\n" \
+             "*titleFont:  -*-helvetica-bold-r-normal-*-*-180-*-*-*-*-*-*\n" \
                        "*showFPS:      False   \n" \
                        "*wireframe:    False   \n" \
 
 #include "tube.h"
 #include "rotator.h"
 #include "gltrackball.h"
-#include "glxfonts.h"
+#include "texfont.h"
 #include <ctype.h>
 
 #ifdef USE_GL /* whole file */
@@ -2657,7 +2657,8 @@ init_juggle (ModeInfo * mi)
 
   sp = &juggles[MI_SCREEN(mi)];
 
-  sp->glx_context = init_GL(mi);
+  if (!sp->glx_context)   /* re-initting breaks print_texture_label */
+    sp->glx_context = init_GL(mi);
 
   sp->font_data = load_texture_font (mi->dpy, "titleFont");
 
@@ -3010,10 +3011,10 @@ draw_juggle (ModeInfo *mi)
        }
   }
 
-  print_gl_string (mi->dpy, sp->font_data,
-                   mi->xgwa.width, mi->xgwa.height,
-                   10, mi->xgwa.height - 10,
-                   sp->pattern, False);
+  glColor3f (1, 1, 0);
+  print_texture_label (mi->dpy, sp->font_data,
+                       mi->xgwa.width, mi->xgwa.height,
+                       1, sp->pattern);
 
 #ifdef MEMTEST
   if((int)(sp->time/10) % 1000 == 0)
index 325e4654b4b597527d1c222ccf849c2bfbd4a8d9..094192c76ba61cc2feaba1d6d751ea2460e4ab9d 100644 (file)
     - gluNewQuadric, gluCylinder, etc: rewrite your code to use tube.c, etc.
 
     - Putting verts in a display list without a wrapping glBegin.
-      (I didn't realize that even worked!)
+      I didn't realize that even worked!  Lockward used to do that,
+      before I fixed it to not.
 
     - Not every function is implemented; just the ones that I needed for
       xscreensaver.  However, the trivial ones are trivial to enable
       winduprobot     Uses SPHERE_MAP.
       jigglypuff      Uses SPHERE_MAP (in chrome mode), GL_LINE (in wireframe)
       jigsaw          Uses GLUtesselator.
-      lockward        Puts verts in lists without glBegin!
       pinion         Uses glSelectBuffer and gluPickMatrix for mouse-clicks.
       pipes           Uses glMap2f for the Utah Teapot.
       polyhedra       Uses GLUtesselator (concave objects); also Utah Teapot.
       skytentacles    Uses GL_LINE in -cel mode.
       timetunnel      Uses GL_CONSTANT_ALPHA and all kinds of other stuff.
-
 */
 
 
 #elif defined(HAVE_COCOA)
 # include <OpenGL/gl.h>
 # include <OpenGL/glu.h>
-#else /* X11 */
+#elif defined(HAVE_ANDROID)
+# include <GLES/gl.h>
+#else /* real X11 */
 # ifndef  GL_GLEXT_PROTOTYPES
 #  define GL_GLEXT_PROTOTYPES /* for glBindBuffer */
 # endif
@@ -306,6 +307,7 @@ typedef struct {    /* All display lists */
 #define ISENABLED_NORM_ARRAY   (1<<13)
 #define ISENABLED_TEX_ARRAY    (1<<14)
 #define ISENABLED_COLOR_ARRAY  (1<<15)
+#define ISENABLED_ALPHA_TEST   (1<<16)
 
 
 typedef struct {
@@ -3369,6 +3371,7 @@ enable_disable (GLuint bit, int set)
   case GL_LIGHTING:       flag = ISENABLED_LIGHTING;                break;
   case GL_BLEND:          flag = ISENABLED_BLEND;                   break;
   case GL_DEPTH_TEST:     flag = ISENABLED_DEPTH_TEST;              break;
+  case GL_ALPHA_TEST:     flag = ISENABLED_ALPHA_TEST;              break;
   case GL_CULL_FACE:      flag = ISENABLED_CULL_FACE;               break;
   case GL_NORMALIZE:      flag = ISENABLED_NORMALIZE;               break;
   case GL_FOG:            flag = ISENABLED_FOG;                             break;
index bfc6ce4db2bbe8f76ff94dbd736cae42b1626f06..770e13eefeffe6ec22ac0493003bf3b57f57ecfa 100644 (file)
@@ -913,6 +913,10 @@ draw (ModeInfo *mi)
     case LAMENT_LID_CLOSE:
     case LAMENT_LID_ZOOM:
       {
+        GLfloat d = 0.21582;
+        int i;
+        const int lists[4] = { OBJ_LID_A, OBJ_LID_B, OBJ_LID_C, OBJ_LID_D };
+
         lc->facing_p = facing_screen_p (mi);
 
         if (lc->anim_z < 0.5)
@@ -920,9 +924,6 @@ draw (ModeInfo *mi)
         else
           glTranslatef (8 * (0.5 - (lc->anim_z - 0.5)), 0, 0);
 
-        GLfloat d = 0.21582;
-        int i;
-        const int lists[4] = { OBJ_LID_A, OBJ_LID_B, OBJ_LID_C, OBJ_LID_D };
         glCallList (lc->dlists[OBJ_LID_BASE]);
         mi->polygon_count += lc->polys[OBJ_LID_BASE];
         for (i = 0; i < countof(lists); i++)
index 16a432001674e6885e1ac22759818e5d09b8cd36..60d684d10878afce7602bc92774411c83e04060c 100644 (file)
 #define        NSPINNERS       4
 #define        NRADII          8
 #define        COLORIDX_SHF    4
+#define        SUBDIV          6
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
 
 
 /***************************************************************************
@@ -106,17 +110,26 @@ enum blinktype {
        MAX_BTYPE
 };
 
+typedef struct { GLfloat x,y,z; } XYZ;
+
 typedef struct lockward_context {
        GLXContext      *glx_context;
 
        spinnerstate    spinners[NSPINNERS];
        blinkstate      blink;
 
-       GLuint          blades_outer, blades_inner;
+        /* This used to put vertexes into lists without putting begin/end
+           into the same list!  I didn't even know that worked.  Well, it
+           doesn't work with jwzgles, so I changed it to not do that. */
+     /* GLuint         blades_outer, blades_inner; */
+        XYZ points_outer[NRADII][SUBDIV+1];
+        XYZ points_inner[NRADII][SUBDIV+1];
+
        GLuint          rings;
        Bool            blendmode;
        int             nextblink;
        int             fps;
+
 } lockward_context;
 
 
@@ -278,7 +291,6 @@ random_blade_rot (lockward_context *ctx, struct spinnerstate *ss)
  * the inner one, or the blade clockwise-ness will be wrong, and become
  * invisible.  Arcs of various radii are compiled.
  */
-#define        SUBDIV          6
 
 static void
 gen_blade_arcs (lockward_context *ctx)
@@ -296,11 +308,19 @@ gen_blade_arcs (lockward_context *ctx)
         * Start at left side of outer radius.  Strike all its vertices.
         */
        for (n = 0;  n < NRADII;  ++n) {
-               glNewList (ctx->blades_outer + n, GL_COMPILE);
-               for (i = SUBDIV;  i >= 0;  --i)
-                       glVertex3f (cos (here + step * i) * (n + 1.0),
-                                   sin (here + step * i) * (n + 1.0), 0);
-               glEndList ();
+          /* glNewList (ctx->blades_outer + n, GL_COMPILE); */
+          XYZ *a = ctx->points_outer[n];
+          int j = 0;
+          for (i = SUBDIV;  i >= 0;  --i) {
+            /* glVertex3f (cos (here + step * i) * (n + 1.0),
+                           sin (here + step * i) * (n + 1.0), 0); */
+            a[j].x = cos (here + step * i) * (n + 1.0);
+            a[j].y = sin (here + step * i) * (n + 1.0);
+            a[j].z = 0;
+            j++;
+          }
+          if (j != SUBDIV+1) abort();
+          /* glEndList (); */
        }
 
        /*
@@ -308,11 +328,19 @@ gen_blade_arcs (lockward_context *ctx)
         * Move to inner radius, strike all vertices in opposite order.
         */
        for (n = 0;  n < NRADII;  ++n) {
-               glNewList (ctx->blades_inner + n, GL_COMPILE);
-               for (i = 0;  i <= SUBDIV;  ++i)
-                       glVertex3f (cos (here + step * i) * (n + 1.0),
-                                   sin (here + step * i) * (n + 1.0), 0);
-               glEndList ();
+          /* glNewList (ctx->blades_inner + n, GL_COMPILE); */
+          XYZ *a = ctx->points_inner[n];
+          int j = 0;
+          for (i = 0;  i <= SUBDIV;  ++i) {
+            /* glVertex3f (cos (here + step * i) * (n + 1.0),
+                          sin (here + step * i) * (n + 1.0), 0); */
+            a[j].x = cos (here + step * i) * (n + 1.0);
+            a[j].y = sin (here + step * i) * (n + 1.0);
+            a[j].z = 0;
+            j++;
+          }
+          if (j != SUBDIV+1) abort();
+          /* glEndList (); */
        }
 }
 
@@ -367,13 +395,25 @@ set_alpha_by_dwell (struct blinkstate *bs)
                bs->color[3] = bs->dwellcnt > (-bs->dwell >> 2)  ?  1.0  : 0.0;
 }
 
+
 static void
-draw_blink_blade (lockward_context *ctx, int inner, int outer)
+draw_blink_blade (lockward_context *ctx, int inner, int outer,
+                  Bool begin_p)
 {
-       glBegin (GL_TRIANGLE_FAN);
-       glCallList (ctx->blades_outer + outer);
-       glCallList (ctx->blades_inner + inner);
-       glEnd ();
+  int i;
+  if (begin_p) glBegin (GL_TRIANGLE_FAN);
+  /* glCallList (ctx->blades_outer + outer); */
+  for (i = 0; i < countof(*ctx->points_outer); i++)
+    glVertex3f(ctx->points_outer[outer][i].x,
+               ctx->points_outer[outer][i].y,
+               ctx->points_outer[outer][i].z);
+
+  /* glCallList (ctx->blades_inner + inner); */
+  for (i = 0; i < countof(*ctx->points_inner); i++)
+    glVertex3f(ctx->points_inner[inner][i].x,
+               ctx->points_inner[inner][i].y,
+               ctx->points_inner[inner][i].z);
+  if (begin_p) glEnd();
 }
 
 static int
@@ -415,9 +455,9 @@ draw_blink_radial_random (lockward_context *ctx, struct blinkstate *bs)
        glColor4fv (bs->color);
        glRotatef (bs->direction * 360.0 / (GLfloat) g_blades, 0, 0, 1);
        if (bs->radius >= 0)
-               draw_blink_blade (ctx, bs->radius, bs->radius + 1);
+               draw_blink_blade (ctx, bs->radius, bs->radius + 1, True);
        else
-               draw_blink_blade (ctx, 0, NRADII - 1);
+               draw_blink_blade (ctx, 0, NRADII - 1, True);
 
        --bs->dwellcnt;
 
@@ -443,7 +483,7 @@ draw_blink_radial_sequential (lockward_context *ctx, struct blinkstate *bs)
        glRotatef ((bs->counter * bs->direction + (int) bs->val)
                    * 360.0 / (GLfloat) g_blades,
                   0, 0, 1);
-       draw_blink_blade (ctx, 0, NRADII - 1);
+       draw_blink_blade (ctx, 0, NRADII - 1, True);
 
        --bs->dwellcnt;
 
@@ -472,7 +512,7 @@ draw_blink_radial_doubleseq (lockward_context *ctx, struct blinkstate *bs)
        glPushMatrix ();
        glRotatef (((int) bs->val + bs->counter) * 360.0 / (GLfloat) g_blades,
                   0, 0, 1);
-       draw_blink_blade (ctx, 0, NRADII - 1);
+       draw_blink_blade (ctx, 0, NRADII - 1, True);
        glPopMatrix ();
        polys = SUBDIV + SUBDIV;
 
@@ -480,7 +520,7 @@ draw_blink_radial_doubleseq (lockward_context *ctx, struct blinkstate *bs)
                glRotatef (((int) bs->val - bs->counter)
                            * 360.0 / (GLfloat) g_blades,
                           0, 0, 1);
-               draw_blink_blade (ctx, 0, NRADII - 1);
+               draw_blink_blade (ctx, 0, NRADII - 1, True);
                polys += SUBDIV + SUBDIV;
        }
 
@@ -591,7 +631,7 @@ draw_blink_segment_scatter (lockward_context *ctx, struct blinkstate *bs)
 
                        glPushMatrix ();
                        glRotatef (i * 360.0 / (GLfloat) g_blades, 0, 0, 1);
-                       draw_blink_blade (ctx, inner, outer);
+                       draw_blink_blade (ctx, inner, outer, True);
                        glPopMatrix ();
 
                        polys += SUBDIV + SUBDIV;
@@ -711,16 +751,20 @@ draw_lockward (ModeInfo *mi)
                glPushMatrix ();
                glRotatef (ss->rot - ss->rotcount * ss->rotinc, 0, 0, 1);
                for (i = ss->nblades;  --i >= 0; ) {
-                       glPushMatrix ();
-                       glRotatef (360.0 * i / ss->nblades, 0, 0, 1);
-
-                       glBegin (GL_TRIANGLE_FAN);
-                       glCallList (ctx->blades_outer + ss->bladeidx[i].outer);
-                       glCallList (ctx->blades_inner + ss->bladeidx[i].inner);
-                       glEnd ();
-
-                       glPopMatrix ();
-                       mi->polygon_count += SUBDIV + SUBDIV;
+                  glPushMatrix ();
+                  glRotatef (360.0 * i / ss->nblades, 0, 0, 1);
+
+                  glBegin (GL_TRIANGLE_FAN);
+                  /* glCallList (ctx->blades_outer + ss->bladeidx[i].outer); */
+                  /* glCallList (ctx->blades_inner + ss->bladeidx[i].inner); */
+                  draw_blink_blade (ctx,
+                                    ss->bladeidx[i].inner,
+                                    ss->bladeidx[i].outer,
+                                    False);
+                  glEnd ();
+
+                  glPopMatrix ();
+                  mi->polygon_count += SUBDIV + SUBDIV;
                }
                glPopMatrix ();
 
@@ -805,8 +849,8 @@ init_lockward (ModeInfo *mi)
        glShadeModel (GL_FLAT);
        glFrontFace (GL_CW);
 
-       ctx->blades_outer       = glGenLists (NRADII);
-       ctx->blades_inner       = glGenLists (NRADII);
+       /* ctx->blades_outer    = glGenLists (NRADII); */
+       /* ctx->blades_inner    = glGenLists (NRADII); */
        ctx->rings              = glGenLists (NRADII - 1);
        ctx->blendmode          = 0;
        ctx->fps                = 1000000 / MI_DELAY (mi);
@@ -892,10 +936,10 @@ free_lockward (lockward_context *ctx)
                free (ctx->blink.noise);
        if (glIsList (ctx->rings))
                glDeleteLists (ctx->rings, NRADII - 1);
-       if (glIsList (ctx->blades_outer))
+       /* if (glIsList (ctx->blades_outer))
                glDeleteLists (ctx->blades_outer, NRADII);
        if (glIsList (ctx->blades_inner))
-               glDeleteLists (ctx->blades_inner, NRADII);
+               glDeleteLists (ctx->blades_inner, NRADII); */
 
        for (i = NSPINNERS;  --i >= 0; ) {
                spinnerstate *ss = &ctx->spinners[i];
index f2fbb8c42857d3e5139d9a770a440817a4a82a6e..b8dd5a41160c76f74a55a02bc11cfd74e8956369 100644 (file)
@@ -108,12 +108,124 @@ reshape_mgears (ModeInfo *mi, int width, int height)
 }
 
 
+static void
+reset_mgears (ModeInfo *mi)
+{
+  mgears_configuration *bp = &bps[MI_SCREEN(mi)];
+  int wire = MI_IS_WIREFRAME(mi);
+  int total_gears = MI_COUNT(mi);
+  double gears_per_turn;
+  double gear_r, tw, th, thick, slope;
+  int i, nubs, size;
+
+  if (! (total_gears & 1)) 
+    total_gears++;             /* must be odd or gears intersect */
+
+  /* Number of teeth must be odd if number of gears is odd, or teeth don't
+     mesh when the loop closes.  And since number of gears must be odd...
+  */
+  if (! (teeth_arg & 1)) teeth_arg++;
+  if (teeth_arg < 7) teeth_arg = 7;
+
+  if (total_gears < 13)        /* gear mesh angle is too steep with less */
+    total_gears = 13;
+
+  thick = 0.2;
+  nubs = (random() & 3) ? 0 : (random() % teeth_arg) / 2;
+
+  slope = 0;
+
+  /* Sloping gears are incompatible with "-roll" ... */
+  /* slope= -M_PI * 2 / total_gears; */
+
+  gears_per_turn = total_gears / 2.0;
+
+  bp->ring_r = 3;
+  gear_r = M_PI * bp->ring_r / gears_per_turn;
+  tw = 0;
+  th = gear_r * 2.5 / teeth_arg;
+
+  /* If the gears are small, use a lower density mesh. */
+  size = (gear_r > 0.60 ? INVOLUTE_HUGE   :
+          gear_r > 0.32 ? INVOLUTE_LARGE  :
+          gear_r > 0.13 ? INVOLUTE_MEDIUM :
+          INVOLUTE_SMALL);
+
+  /* If there are lots of teeth, use a lower density mesh. */
+  if (teeth_arg > 77)
+    size = INVOLUTE_SMALL;
+  if (teeth_arg > 45 && size >= INVOLUTE_HUGE)
+    size = INVOLUTE_MEDIUM;
+
+  if (bp->gears)
+    {
+      for (i = 0; i < bp->ngears; i++)
+        glDeleteLists (bp->gears[i].g.dlist, 1);
+      free (bp->gears);
+      bp->gears = 0;
+    }
+
+  bp->ngears = total_gears;
+
+  bp->gears = (mogear *) calloc (bp->ngears, sizeof(*bp->gears));
+  for (i = 0; i < bp->ngears; i++)
+    {
+      mogear *mg = &bp->gears[i];
+      gear *g = &mg->g;
+
+      g->r           = gear_r;
+      g->size        = size;
+      g->nteeth      = teeth_arg;
+      g->tooth_w     = tw;
+      g->tooth_h     = th;
+      g->tooth_slope = slope;
+      g->thickness   = g->r * thick;
+      g->thickness2  = g->thickness * 0.1;
+      g->thickness3  = g->thickness;
+      g->inner_r     = g->r * 0.80;
+      g->inner_r2    = g->r * 0.60;
+      g->inner_r3    = g->r * 0.55;
+      g->nubs        = nubs;
+      mg->pos_th     = (M_PI * 2 / gears_per_turn) * i;
+      mg->pos_thz    = (M_PI / 2 / gears_per_turn) * i;
+
+      g->th = ((i & 1)
+               ? (M_PI * 2 / g->nteeth)
+               : 0);
+
+      /* Colorize
+       */
+      g->color[0] = 0.7 + frand(0.3);
+      g->color[1] = 0.7 + frand(0.3);
+      g->color[2] = 0.7 + frand(0.3);
+      g->color[3] = 1.0;
+
+      g->color2[0] = g->color[0] * 0.85;
+      g->color2[1] = g->color[1] * 0.85;
+      g->color2[2] = g->color[2] * 0.85;
+      g->color2[3] = g->color[3];
+
+      /* Now render the gear into its display list.
+       */
+      g->dlist = glGenLists (1);
+      if (! g->dlist)
+        {
+          check_gl_error ("glGenLists");
+          abort();
+        }
+
+      glNewList (g->dlist, GL_COMPILE);
+      g->polygons += draw_involute_gear (g, wire);
+      glEndList ();
+    }
+}
+
+
 ENTRYPOINT void 
 init_mgears (ModeInfo *mi)
 {
   mgears_configuration *bp;
   int wire = MI_IS_WIREFRAME(mi);
-  int i;
 
   if (!bps) {
     bps = (mgears_configuration *)
@@ -148,7 +260,6 @@ init_mgears (ModeInfo *mi)
       glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
     }
 
-  if (! bp->rot)
   {
     double spin_speed   = 0.5;
     double wander_speed = 0.01;
@@ -164,111 +275,7 @@ init_mgears (ModeInfo *mi)
     bp->trackball = gltrackball_init (True);
   }
 
-  {
-    int total_gears = MI_COUNT(mi);
-    double gears_per_turn;
-    double gear_r, tw, th, thick, slope;
-    int nubs, size;
-
-    if (! (total_gears & 1)) 
-      total_gears++;           /* must be odd or gears intersect */
-
-    /* Number of teeth must be odd if number of gears is odd, or teeth don't
-       mesh when the loop closes.  And since number of gears must be odd...
-     */
-    if (! (teeth_arg & 1)) teeth_arg++;
-    if (teeth_arg < 7) teeth_arg = 7;
-
-    if (total_gears < 13)      /* gear mesh angle is too steep with less */
-      total_gears = 13;
-
-    thick = 0.2;
-    nubs = (random() & 3) ? 0 : (random() % teeth_arg) / 2;
-
-    slope = 0;
-
-    /* Sloping gears are incompatible with "-roll" ... */
-    /* slope= -M_PI * 2 / total_gears; */
-
-    gears_per_turn = total_gears / 2.0;
-
-    bp->ring_r = 3;
-    gear_r = M_PI * bp->ring_r / gears_per_turn;
-    tw = 0;
-    th = gear_r * 2.5 / teeth_arg;
-
-    /* If the gears are small, use a lower density mesh. */
-    size = (gear_r > 0.32 ? INVOLUTE_LARGE  :
-            gear_r > 0.13 ? INVOLUTE_MEDIUM :
-            INVOLUTE_SMALL);
-
-    /* If there are lots of teeth, use a lower density mesh. */
-    if (teeth_arg > 77)
-      size = INVOLUTE_SMALL;
-    if (teeth_arg > 45 && size == INVOLUTE_LARGE)
-      size = INVOLUTE_MEDIUM;
-
-    if (bp->gears)
-      {
-        for (i = 0; i < bp->ngears; i++)
-          glDeleteLists (bp->gears[i].g.dlist, 1);
-        free (bp->gears);
-      }
-
-    bp->ngears = total_gears;
-
-    bp->gears = (mogear *) calloc (bp->ngears, sizeof(*bp->gears));
-    for (i = 0; i < bp->ngears; i++)
-      {
-        mogear *mg = &bp->gears[i];
-        gear *g = &mg->g;
-
-        g->r           = gear_r;
-        g->size        = size;
-        g->nteeth      = teeth_arg;
-        g->tooth_w     = tw;
-        g->tooth_h     = th;
-        g->tooth_slope = slope;
-        g->thickness   = g->r * thick;
-        g->thickness2  = g->thickness * 0.1;
-        g->thickness3  = g->thickness;
-        g->inner_r     = g->r * 0.80;
-        g->inner_r2    = g->r * 0.60;
-        g->inner_r3    = g->r * 0.55;
-        g->nubs        = nubs;
-        mg->pos_th     = (M_PI * 2 / gears_per_turn) * i;
-        mg->pos_thz    = (M_PI / 2 / gears_per_turn) * i;
-
-        g->th = ((i & 1)
-                 ? (M_PI * 2 / g->nteeth)
-                 : 0);
-
-        /* Colorize
-         */
-        g->color[0] = 0.7 + frand(0.3);
-        g->color[1] = 0.7 + frand(0.3);
-        g->color[2] = 0.7 + frand(0.3);
-        g->color[3] = 1.0;
-
-        g->color2[0] = g->color[0] * 0.85;
-        g->color2[1] = g->color[1] * 0.85;
-        g->color2[2] = g->color[2] * 0.85;
-        g->color2[3] = g->color[3];
-
-        /* Now render the gear into its display list.
-         */
-        g->dlist = glGenLists (1);
-        if (! g->dlist)
-          {
-            check_gl_error ("glGenLists");
-            abort();
-          }
-
-        glNewList (g->dlist, GL_COMPILE);
-        g->polygons += draw_involute_gear (g, wire);
-        glEndList ();
-      }
-  }
+  reset_mgears (mi);
 }
 
 
@@ -290,7 +297,7 @@ mgears_handle_event (ModeInfo *mi, XEvent *event)
           keysym == XK_Up || keysym == XK_Right || keysym == XK_Next)
         {
           MI_COUNT(mi) += 2;
-          init_mgears (mi);
+          reset_mgears (mi);
           return True;
         }
       else if (c == '-' || c == '_' ||
@@ -299,7 +306,7 @@ mgears_handle_event (ModeInfo *mi, XEvent *event)
           if (MI_COUNT(mi) <= 13)
             return False;
           MI_COUNT(mi) -= 2;
-          init_mgears (mi);
+          reset_mgears (mi);
           return True;
         }
       else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
@@ -309,7 +316,7 @@ mgears_handle_event (ModeInfo *mi, XEvent *event)
     {
     DEF:
       MI_COUNT(mi) = 13 + (2 * (random() % 10));
-      init_mgears (mi);
+      reset_mgears (mi);
       return True;
     }
 
index f1b4f7e958d06e0f0d1ceef67ecdf17600e9973b..b5e6e8420f945e268a3f65cfe77048e58c318016 100644 (file)
    http://www.wwpdb.org/docs.html
  */
 
-#define ATOM_FONT "-*-helvetica-medium-r-normal-*-240-*"
-
 #define DEFAULTS       "*delay:        10000         \n" \
                        "*showFPS:      False         \n" \
                        "*wireframe:    False         \n" \
-                       "*atomFont:   " ATOM_FONT "\n" \
-                       "*atomFont2:  -*-helvetica-bold-r-normal-*-80-*\n" \
-                       "*titleFont:  -*-helvetica-medium-r-normal-*-180-*\n" \
-                       "*noLabelThreshold:    30     \n" \
+       "*atomFont:   -*-helvetica-medium-r-normal-*-*-240-*-*-*-*-*-*\n" \
+       "*titleFont:  -*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*\n" \
+                       "*noLabelThreshold:    150    \n" \
                        "*wireframeThreshold:  150    \n" \
 
 # define refresh_molecule 0
@@ -44,7 +41,7 @@
 #include "colors.h"
 #include "sphere.h"
 #include "tube.h"
-#include "glxfonts.h"
+#include "texfont.h"
 #include "rotator.h"
 #include "gltrackball.h"
 
@@ -163,18 +160,20 @@ typedef struct {
 
   int mode;  /* 0 = normal, 1 = out, 2 = in */
   int mode_tick;
+  int next;  /* 0 = random, -1 = back, 1 = forward */
 
   GLuint molecule_dlist;
   GLuint shell_dlist;
 
-  texture_font_data *font1_data, *font2_data, *font3_data;
+  texture_font_data *atom_font, *title_font;
 
   int polygon_count;
 
   time_t draw_time;
   int draw_tick;
 
-  int scale_down;
+  GLfloat overall_scale;
+  int low_rez_p;
 
 } molecule_configuration;
 
@@ -248,8 +247,8 @@ static int
 sphere (molecule_configuration *mc,
         GLfloat x, GLfloat y, GLfloat z, GLfloat diameter, Bool wire)
 {
-  int stacks = (mc->scale_down ? SPHERE_STACKS_2 : SPHERE_STACKS);
-  int slices = (mc->scale_down ? SPHERE_SLICES_2 : SPHERE_SLICES);
+  int stacks = (mc->low_rez_p ? SPHERE_STACKS_2 : SPHERE_STACKS);
+  int slices = (mc->low_rez_p ? SPHERE_SLICES_2 : SPHERE_SLICES);
 
   glPushMatrix ();
   glTranslatef (x, y, z);
@@ -265,9 +264,8 @@ static void
 load_fonts (ModeInfo *mi)
 {
   molecule_configuration *mc = &mcs[MI_SCREEN(mi)];
-  mc->font1_data = load_texture_font (mi->dpy, "atomFont");
-  mc->font2_data = load_texture_font (mi->dpy, "atomFont2");
-  mc->font3_data = load_texture_font (mi->dpy, "titleFont");
+  mc->atom_font = load_texture_font (mi->dpy, "atomFont");
+  mc->title_font = load_texture_font (mi->dpy, "titleFont");
 }
 
 
@@ -519,14 +517,15 @@ ensure_bounding_box_visible (ModeInfo *mi)
 
   mc->molecule_size = size;
 
-  mc->scale_down = 0;
+  mc->low_rez_p = 0;
+  mc->overall_scale = 1;
 
   if (size > max_size)
     {
-      GLfloat scale = max_size / size;
-      glScalef (scale, scale, scale);
+      mc->overall_scale = max_size / size;
+      glScalef (mc->overall_scale, mc->overall_scale, mc->overall_scale);
 
-      mc->scale_down = scale < 0.3;
+      mc->low_rez_p = mc->overall_scale < 0.3;
     }
 
   glTranslatef (-(x1 + w/2),
@@ -588,21 +587,23 @@ build_molecule (ModeInfo *mi, Bool transparent_p)
           }
         else
           {
-            int faces = (mc->scale_down ? TUBE_FACES_2 : TUBE_FACES);
+            int faces = (mc->low_rez_p ? TUBE_FACES_2 : TUBE_FACES);
 # ifdef SMOOTH_TUBE
             int smooth = True;
 # else
             int smooth = False;
 # endif
-            GLfloat thickness = 0.07 * b->strength;
-            GLfloat cap_size = 0.03;
+            Bool cap_p = (!do_atoms || do_shells);
+            GLfloat base = 0.07;
+            GLfloat thickness = base * b->strength;
+            GLfloat cap_size = (cap_p ? base / 2 : 0);
             if (thickness > 0.3)
               thickness = 0.3;
 
             polys += tube (from->x, from->y, from->z,
                            to->x,   to->y,   to->z,
                            thickness, cap_size,
-                           faces, smooth, (!do_atoms || do_shells), wire);
+                           faces, smooth, cap_p, wire);
           }
       }
 
@@ -1218,10 +1219,9 @@ startup_blurb (ModeInfo *mi)
 {
   molecule_configuration *mc = &mcs[MI_SCREEN(mi)];
   const char *s = "Constructing molecules...";
-  print_gl_string (mi->dpy, mc->font3_data,
-                   mi->xgwa.width, mi->xgwa.height,
-                   10, mi->xgwa.height - 10,
-                   s, False);
+  print_texture_label (mi->dpy, mc->title_font,
+                       mi->xgwa.width, mi->xgwa.height,
+                       0, s);
   glFinish();
   glXSwapBuffers(MI_DISPLAY(mi), MI_WINDOW(mi));
 }
@@ -1235,12 +1235,35 @@ molecule_handle_event (ModeInfo *mi, XEvent *event)
                                  MI_WIDTH (mi), MI_HEIGHT (mi),
                                  &mc->button_down_p))
     return True;
-  else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+  else
     {
-      GLfloat speed = 4.0;
-      mc->mode = 1;
-      mc->mode_tick = 10 * speed;
-      return True;
+      if (event->xany.type == KeyPress)
+        {
+          KeySym keysym;
+          char c = 0;
+          XLookupString (&event->xkey, &c, 1, &keysym, 0);
+          if (c == '<' || c == ',' || c == '-' || c == '_' ||
+              keysym == XK_Left || keysym == XK_Up || keysym == XK_Prior)
+            {
+              mc->next = -1;
+              goto SWITCH;
+            }
+          else if (c == '>' || c == '.' || c == '=' || c == '+' ||
+                   keysym == XK_Right || keysym == XK_Down ||
+                   keysym == XK_Next)
+            {
+              mc->next = 1;
+              goto SWITCH;
+            }
+        }
+
+      if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+        {
+        SWITCH:
+          mc->mode = 1;
+          mc->mode_tick = 4;
+          return True;
+        }
     }
 
   return False;
@@ -1398,15 +1421,13 @@ draw_labels (ModeInfo *mi)
 
       {
         int h;
-        int w = texture_string_width (mc->font1_data, a->label, &h);
-        GLfloat s = 1.0 / h;
-        GLfloat max = 18;   /* max point size to avoid pixellated text */
-        if (h > max) s *= max/h;
+        int w = texture_string_width (mc->atom_font, a->label, &h);
+        GLfloat s = 1.0 / h;           /* Scale to unit */
+        s *= mc->overall_scale;                /* Scale to size of atom */
+        s *= 0.8;                      /* Shrink a bit */
         glScalef (s, s, 1);
-        glTranslatef (-w/2, h*2/3, 0);
-        print_gl_string (mi->dpy, mc->font1_data,
-                         0, 0, 0, 0,
-                         a->label, False);
+        glTranslatef (-w * 0.5, h * 0.3 - h, 0);
+        print_texture_string (mc->atom_font, a->label);
       }
 
       glPopMatrix();
@@ -1435,6 +1456,18 @@ pick_new_molecule (ModeInfo *mi, time_t last)
     {
       mc->which = random() % mc->nmolecules;
     }
+  else if (mc->next < 0)
+    {
+      mc->which--;
+      if (mc->which < 0) mc->which = mc->nmolecules-1;
+      mc->next = 0;
+    }
+  else if (mc->next > 0)
+    {
+      mc->which++;
+      if (mc->which >= mc->nmolecules) mc->which = 0;
+      mc->next = 0;
+    }
   else
     {
       int n = mc->which;
@@ -1537,7 +1570,7 @@ draw_molecule (ModeInfo *mi)
             {
               /* randomize molecules every -timeout seconds */
               mc->mode = 1;    /* go out */
-              mc->mode_tick = 10 * speed;
+              mc->mode_tick = 80 / speed;
               mc->draw_time = now;
             }
         }
@@ -1546,10 +1579,9 @@ draw_molecule (ModeInfo *mi)
     {
       if (--mc->mode_tick <= 0)
         {
-          mc->mode_tick = 10 * speed;
+          mc->mode_tick = 80 / speed;
           mc->mode = 2;  /* go in */
           pick_new_molecule (mi, mc->draw_time);
-          mc->draw_time = now;
         }
     }
   else if (mc->mode == 2)   /* in */
@@ -1583,8 +1615,8 @@ draw_molecule (ModeInfo *mi)
   if (mc->mode != 0)
     {
       GLfloat s = (mc->mode == 1
-                   ? mc->mode_tick / (10 * speed)
-                   : ((10 * speed) - mc->mode_tick + 1) / (10 * speed));
+                   ? mc->mode_tick / (80 / speed)
+                   : ((80 / speed) - mc->mode_tick + 1) / (80 / speed));
       glScalef (s, s, s);
     }
 
@@ -1602,10 +1634,9 @@ draw_molecule (ModeInfo *mi)
       if (do_titles && m->label && *m->label)
         {
           set_atom_color (mi, 0, True, 1);
-          print_gl_string (mi->dpy, mc->font3_data,
-                           mi->xgwa.width, mi->xgwa.height,
-                           10, mi->xgwa.height - 10,
-                           m->label, False);
+          print_texture_label (mi->dpy, mc->title_font,
+                               mi->xgwa.width, mi->xgwa.height,
+                               1, m->label);
         }
     }
   glPopMatrix();
index aa52d162e5e816d3269b561a7e9101561e6b9aa4..671ca13843923dfa80875fdc2dde0ea474ab38d0 100644 (file)
@@ -11,7 +11,7 @@
  * implied warranty.
  */
 
-#define DEF_FONT "-*-helvetica-bold-r-normal-*-240-*"
+#define DEF_FONT "-*-helvetica-bold-r-normal-*-*-480-*-*-*-*-*-*"
 #define DEFAULTS  "*count:           7         \n" \
                   "*delay:           10000     \n" \
                   "*wireframe:       False     \n" \
@@ -630,7 +630,7 @@ draw_image (ModeInfo *mi, int i, GLfloat t, GLfloat s, GLfloat z)
   if (titles_p)
     {
       int sw, sh;
-      GLfloat scale = 0.6;
+      GLfloat scale = 1;
       const char *title = frame->title ? frame->title : "(untitled)";
 
       /* #### Highly approximate, but doing real clipping is harder... */
@@ -640,6 +640,8 @@ draw_image (ModeInfo *mi, int i, GLfloat t, GLfloat s, GLfloat z)
 
       sw = texture_string_width (ss->texfont, title, &sh);
 
+      sh *= (polaroid_p ? 2.2 : 1.4);  /* move text down from the photo */
+
       glTranslatef (-sw*scale*0.5, -h - sh*scale, z);
       glScalef (scale, scale, 1);
 
index 45aedfbd26cd9f12eae35a7675f43d2cde6f01c1..389786de62f50990c2c032d4c9fd7a6a82d56797 100644 (file)
@@ -12,9 +12,9 @@
 #define DEFAULTS        "*delay:        15000              \n" \
                         "*showFPS:      False              \n" \
                         "*wireframe:    False              \n" \
-                        "*titleFont:  -*-helvetica-medium-r-normal-*-180-*\n" \
-                        "*titleFont2: -*-helvetica-medium-r-normal-*-120-*\n" \
-                        "*titleFont3: -*-helvetica-medium-r-normal-*-80-*\n"  \
+           "*titleFont:  -*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*\n" \
+           "*titleFont2: -*-helvetica-medium-r-normal-*-*-120-*-*-*-*-*-*\n" \
+           "*titleFont3: -*-helvetica-medium-r-normal-*-*-80-*-*-*-*-*-*\n"  \
 
 # define refresh_pinion 0
 # define release_pinion 0
@@ -27,7 +27,7 @@
 #include "xlockmore.h"
 #include "normals.h"
 #include "gltrackball.h"
-#include "glxfonts.h"
+#include "texfont.h"
 #include "involute.h"
 #include <ctype.h>
 
@@ -55,7 +55,6 @@ typedef struct {
 
   texture_font_data *font1, *font2, *font3;
 
-  GLuint title_list;
   int draw_tick;
 
   GLfloat plane_displacement;        /* distance between coaxial gears */
@@ -119,7 +118,7 @@ load_fonts (ModeInfo *mi)
 static void rpm_string (double rpm, char *s);
 
 static void
-new_label (ModeInfo *mi)
+draw_label (ModeInfo *mi)
 {
   pinion_configuration *pp = &pps[MI_SCREEN(mi)];
   char label[1024];
@@ -149,7 +148,6 @@ new_label (ModeInfo *mi)
                  g->tooth_h * MI_HEIGHT(mi));
     }
 
-  glNewList (pp->title_list, GL_COMPILE);
   if (*label)
     {
       texture_font_data *fd;
@@ -161,12 +159,10 @@ new_label (ModeInfo *mi)
         fd = pp->font3;
 
       glColor3f (0.8, 0.8, 0);
-      print_gl_string (mi->dpy, fd,
-                       mi->xgwa.width, mi->xgwa.height,
-                       10, mi->xgwa.height - 10,
-                       label, False);
+      print_texture_label (mi->dpy, fd,
+                           mi->xgwa.width, mi->xgwa.height,
+                           1, label);
     }
-  glEndList ();
 }
 
 \f
@@ -312,6 +308,10 @@ new_gear (ModeInfo *mi, gear *parent, Bool coaxial_p)
 
   /* g->tooth_slope = (parent ? -parent->tooth_slope : 4); */
 
+  if (debug_one_gear_p)
+    g->tooth_slope = frand(20)-10;
+
+
   /* Colorize
    */
   g->color[0] = 0.5 + frand(0.5);
@@ -411,7 +411,8 @@ new_gear (ModeInfo *mi, gear *parent, Bool coaxial_p)
     double pix = g->tooth_h * MI_HEIGHT(mi); /* approx. tooth size in pixels */
     if (pix <= 2.5)      g->size = INVOLUTE_SMALL;
     else if (pix <= 3.5) g->size = INVOLUTE_MEDIUM;
-    else                 g->size = INVOLUTE_LARGE;
+    else if (pix <= 25)  g->size = INVOLUTE_LARGE;
+    else                 g->size = INVOLUTE_HUGE;
   }
 
   g->base_p = !parent;
@@ -1232,7 +1233,7 @@ find_mouse_gear (ModeInfo *mi)
 
 #else  /* HAVE_JWZGLES */
   /* #### not yet implemented */
-  pp->mouse_gear_id = pp->gears[1]->id;
+  pp->mouse_gear_id = (pp->ngears > 1 ? pp->gears[1]->id : 0);
   return;
 #endif /* HAVE_JWZGLES */
 
@@ -1331,8 +1332,6 @@ init_pinion (ModeInfo *mi)
   reshape_pinion (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
   clear_gl_error(); /* WTF? sometimes "invalid op" from glViewport! */
 
-  pp->title_list  = glGenLists (1);
-
   pp->ngears = 0;
   pp->gears_size = 0;
   pp->gears = 0;
@@ -1453,12 +1452,11 @@ draw_pinion (ModeInfo *mi)
       {
         pp->draw_tick = 0;
         find_mouse_gear (mi);
-        new_label (mi);
       }
   }
   glPopMatrix ();
 
-  glCallList (pp->title_list);
+  draw_label (mi);
   glPopMatrix ();
 
   if (mi->fps_p) do_fps (mi);
index 57a7938787cd0b4c65522fc79b5dcbafb15c9a5f..b931069ce37f243b3819ab85fc49ff2f803bf396 100644 (file)
@@ -18,9 +18,9 @@
 #define DEFAULTS       "*delay:        30000         \n" \
                        "*showFPS:      False         \n" \
                        "*wireframe:    False         \n" \
-                       "*titleFont:  -*-helvetica-medium-r-normal-*-140-*\n" \
-                       "*titleFont2: -*-helvetica-medium-r-normal-*-100-*\n" \
-                       "*titleFont3: -*-helvetica-medium-r-normal-*-80-*\n"  \
+       "*titleFont:  -*-helvetica-medium-r-normal-*-*-140-*-*-*-*-*-*\n" \
+       "*titleFont2: -*-helvetica-medium-r-normal-*-*-100-*-*-*-*-*-*\n" \
+       "*titleFont3: -*-helvetica-medium-r-normal-*-*-80-*-*-*-*-*-*\n"  \
 
 
 # define refresh_polyhedra 0
@@ -49,7 +49,7 @@
 #define DEF_DURATION    "12"
 #define DEF_WHICH       "random"
 
-#include "glxfonts.h"
+#include "texfont.h"
 #include "normals.h"
 #include "polyhedra.h"
 #include "colors.h"
@@ -81,7 +81,6 @@ typedef struct {
   int which;
   int change_to;
   GLuint object_list;
-  GLuint title_list;
 
   int mode;  /* 0 = normal, 1 = out, 2 = in */
   int mode_tick;
@@ -186,13 +185,9 @@ startup_blurb (ModeInfo *mi)
   texture_font_data *f = bp->font1_data;
 
   glColor3f (0.8, 0.8, 0);
-  print_gl_string (mi->dpy, bp->font1_data,
-                   mi->xgwa.width, mi->xgwa.height,
-                   mi->xgwa.width - (
-                                     texture_string_width (f, s, 0)
-                                     + 40),
-                   mi->xgwa.height - 10,
-                   s, False);
+  print_texture_label (mi->dpy, f,
+                       mi->xgwa.width, mi->xgwa.height,
+                       0, s);
   glFinish();
   glXSwapBuffers(MI_DISPLAY(mi), MI_WINDOW(mi));
 }
@@ -201,8 +196,6 @@ startup_blurb (ModeInfo *mi)
 
 /* Window management, etc
  */
-static void new_label (ModeInfo *mi);
-
 ENTRYPOINT void
 reshape_polyhedra (ModeInfo *mi, int width, int height)
 {
@@ -221,9 +214,6 @@ reshape_polyhedra (ModeInfo *mi, int width, int height)
              0.0, 1.0, 0.0);
 
   glClear(GL_COLOR_BUFFER_BIT);
-
-  /* need to re-render the text when the window size changes */
-  new_label (mi);
 }
 
 
@@ -270,56 +260,50 @@ polyhedra_handle_event (ModeInfo *mi, XEvent *event)
 
 
 static void
-new_label (ModeInfo *mi)
+draw_label (ModeInfo *mi)
 {
   polyhedra_configuration *bp = &bps[MI_SCREEN(mi)];
   polyhedron *p = bp->which >= 0 ? bp->polyhedra[bp->which] : 0;
+  char label[1024];
+  char name2[255];
+  GLfloat color[4] = { 0.8, 0.8, 0.8, 1 };
+  texture_font_data *f;
+
+  if (!p || !do_titles) return;
+
+  strcpy (name2, p->name);
+  if (*p->class)
+    sprintf (name2 + strlen(name2), "  (%s)", p->class);
+
+  sprintf (label,
+           "Polyhedron %d:   \t%s\n\n"
+           "Wythoff Symbol:\t%s\n"
+           "Vertex Configuration:\t%s\n"
+           "Symmetry Group:\t%s\n"
+        /* "Dual of:              \t%s\n" */
+           "\n"
+           "Faces:\t  %d\n"
+           "Edges:\t  %d\n"
+           "Vertices:\t  %d\n"
+           "Density:\t  %d\n"
+           "Euler:\t%s%d\n",
+           bp->which, name2, p->wythoff, p->config, p->group,
+        /* p->dual, */
+           p->logical_faces, p->nedges, p->logical_vertices,
+           p->density, (p->chi < 0 ? "" : "  "), p->chi);
+
+  if (MI_WIDTH(mi) >= 500 && MI_HEIGHT(mi) >= 375)
+    f = bp->font1_data;
+  else if (MI_WIDTH(mi) >= 350 && MI_HEIGHT(mi) >= 260)
+    f = bp->font2_data;                                       /* small font */
+  else
+    f = bp->font3_data;                                       /* tiny font */
 
-  glNewList (bp->title_list, GL_COMPILE);
-  if (p && do_titles)
-    {
-      char label[1024];
-      char name2[255];
-      strcpy (name2, p->name);
-      if (*p->class)
-        sprintf (name2 + strlen(name2), "  (%s)", p->class);
-
-      sprintf (label,
-               "Polyhedron %d:   \t%s\n\n"
-               "Wythoff Symbol:\t%s\n"
-               "Vertex Configuration:\t%s\n"
-               "Symmetry Group:\t%s\n"
-            /* "Dual of:              \t%s\n" */
-               "\n"
-               "Faces:\t  %d\n"
-               "Edges:\t  %d\n"
-               "Vertices:\t  %d\n"
-               "Density:\t  %d\n"
-               "Euler:\t%s%d\n",
-               bp->which, name2, p->wythoff, p->config, p->group,
-            /* p->dual, */
-               p->logical_faces, p->nedges, p->logical_vertices,
-               p->density, (p->chi < 0 ? "" : "  "), p->chi);
-
-      {
-        GLfloat color[4] = { 0.8, 0.8, 0.8, 1 };
-        texture_font_data *f;
-        if (MI_WIDTH(mi) >= 500 && MI_HEIGHT(mi) >= 375)
-          f = bp->font1_data;
-        else if (MI_WIDTH(mi) >= 350 && MI_HEIGHT(mi) >= 260)
-          f = bp->font2_data;                                 /* small font */
-        else
-          f = bp->font3_data;                                 /* tiny font */
-
-        glColor4fv (color);
-        glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
-        print_gl_string (mi->dpy, f,
-                         mi->xgwa.width, mi->xgwa.height,
-                         10, mi->xgwa.height - 10,
-                         label, False);
-      }
-    }
-  glEndList ();
+  glColor4fv (color);
+  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
+  print_texture_label (mi->dpy, f,
+                       mi->xgwa.width, mi->xgwa.height,
+                       1, label);
 }
 
 
@@ -370,8 +354,6 @@ new_polyhedron (ModeInfo *mi)
   bp->change_to = -1;
   p = bp->polyhedra[bp->which];
 
-  new_label (mi);
-
   if (wire)
     glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
 
@@ -537,7 +519,6 @@ init_polyhedra (ModeInfo *mi)
   construct_teapot (mi);
 
   bp->object_list = glGenLists (1);
-  bp->title_list  = glGenLists (1);
   bp->change_to = -1;
 
   {
@@ -615,7 +596,7 @@ draw_polyhedra (ModeInfo *mi)
           if (!bp->button_down_p && now - bp->last_change_time >= duration)
             {
               bp->mode = 1;    /* go out */
-              bp->mode_tick = 20 * speed;
+              bp->mode_tick = 20 / speed;
               bp->last_change_time = now;
             }
         }
@@ -625,7 +606,7 @@ draw_polyhedra (ModeInfo *mi)
       if (--bp->mode_tick <= 0)
         {
           new_polyhedron (mi);
-          bp->mode_tick = 20 * speed;
+          bp->mode_tick = 20 / speed;
           bp->mode = 2;  /* go in */
         }
     }
@@ -669,15 +650,15 @@ draw_polyhedra (ModeInfo *mi)
   if (bp->mode != 0)
     {
       GLfloat s = (bp->mode == 1
-                   ? bp->mode_tick / (20 * speed)
-                   : ((20 * speed) - bp->mode_tick + 1) / (20 * speed));
+                   ? bp->mode_tick / (20 / speed)
+                   : ((20 / speed) - bp->mode_tick + 1) / (20 / speed));
       glScalef (s, s, s);
     }
 
   glScalef (2, 2, 2);
   glCallList (bp->object_list);
   if (bp->mode == 0 && !bp->button_down_p)
-    glCallList (bp->title_list);
+    draw_label (mi);    /* print_texture_font can't go inside a display list */
 
   glPopMatrix ();
 
index be2e0c164c8ac6f1fb86a30dc09ec33ebcb4c1c3..d2d3f5c16b0b3c73c5787a9f9244bf2cb14ca375 100644 (file)
@@ -121,6 +121,24 @@ quasicrystal_handle_event (ModeInfo *mi, XEvent *event)
       bp->button_down_p = False;
       return True;
     }
+  else if (event->xany.type == ButtonPress &&  /* wheel up or right */
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button7))
+    {
+    UP:
+      if (bp->contrast <= 0) return False;
+      bp->contrast--;
+      return True;
+    }
+  else if (event->xany.type == ButtonPress &&  /* wheel down or left */
+           (event->xbutton.button == Button5 ||
+            event->xbutton.button == Button6))
+    {
+    DOWN:
+      if (bp->contrast >= 100) return False;
+      bp->contrast++;
+      return True;
+    }
   else if (event->xany.type == MotionNotify &&
            bp->button_down_p)
     {
@@ -140,6 +158,24 @@ quasicrystal_handle_event (ModeInfo *mi, XEvent *event)
       bp->mousey = event->xmotion.y;
       return True;
     }
+  else
+    {
+      if (event->xany.type == KeyPress)
+        {
+          KeySym keysym;
+          char c = 0;
+          XLookupString (&event->xkey, &c, 1, &keysym, 0);
+          if (c == '<' || c == ',' || c == '-' || c == '_' ||
+              keysym == XK_Left || keysym == XK_Up || keysym == XK_Prior)
+            goto UP;
+          else if (c == '>' || c == '.' || c == '=' || c == '+' ||
+                   keysym == XK_Right || keysym == XK_Down ||
+                   keysym == XK_Next)
+            goto DOWN;
+        }
+
+      return screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event);
+    }
 
   return False;
 }
@@ -289,6 +325,11 @@ draw_quasicrystal (ModeInfo *mi)
   glDisable(GL_DEPTH_TEST);
   glDisable(GL_CULL_FACE);
   glDisable (GL_LIGHTING);
+  if (!wire)
+    {
+      glEnable (GL_TEXTURE_1D);
+      glEnable (GL_TEXTURE_2D);  /* jwzgles needs this too, bleh. */
+    }
 
   glEnable (GL_BLEND);
   glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@@ -346,10 +387,7 @@ draw_quasicrystal (ModeInfo *mi)
       glColor4f (1, 1, 1, (wire ? 0.5 : 1.0 / bp->count));
 
       if (!wire)
-        {
-          glEnable (GL_TEXTURE_1D);
-          glBindTexture (GL_TEXTURE_1D, p->texid);
-        }
+        glBindTexture (GL_TEXTURE_1D, p->texid);
 
       glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
       glNormal3f (0, 0, 1);
index 80b64b7c121f78a50c23b39e98d0a4ac78f3315b..74e7b6b252c5d5fd8b1aae72b336ea21aa55a2cc 100644 (file)
@@ -51,7 +51,7 @@
  *   - plot IM contacts or Facebook friends and their last-activity times.
  */
 
-#define DEF_FONT "-*-lucidatypewriter-bold-r-normal-*-*-480-*-*-*-*-iso8859-1"
+#define DEF_FONT "-*-courier-bold-r-normal-*-*-480-*-*-*-*-iso8859-1"
 #define DEF_SPEED        "1.0"
 #define DEF_SWEEP_SIZE   "0.3"
 #define DEF_FONT_SIZE    "12"
 #define DEF_WOBBLE       "True"
 #define DEF_DEBUG        "False"
 
+#include "thread_util.h"
+
 #define DEFAULTS       "*delay:        30000       \n" \
                        "*font:       " DEF_FONT   "\n" \
                        "*showFPS:      False       \n" \
                        "*wireframe:    False       \n" \
+                       "*texFontCacheSize: 300     \n" \
+                       THREAD_DEFAULTS_XLOCK
 
 
 # define refresh_sonar 0
 
 #ifdef USE_GL /* whole file */
 
+/* #define TEST_ASYNC_NETDB 1 */
+
+# if TEST_ASYNC_NETDB
+#   include "async_netdb.h"
+
+#   include <assert.h>
+#   include <netinet/in.h>
+#   include <stdio.h>
+# endif /* TEST_ASYNC_NETDB */
+
 typedef struct {
   double x,y,z;
 } XYZ;
@@ -117,6 +131,10 @@ typedef struct {
   sonar_bogie *displayed;      /* on screen and fading */
   sonar_bogie *pending;                /* returned by sensor, not yet on screen */
 
+# if TEST_ASYNC_NETDB
+  async_name_from_addr_t query0;
+  async_addr_from_name_t query1;
+# endif
 } sonar_configuration;
 
 static sonar_configuration *sps = NULL;
@@ -152,6 +170,7 @@ static XrmOptionDescRec opts[] = {
   { "+times",        ".times",       XrmoptionNoArg, "False" },
   { "-wobble",       ".wobble",      XrmoptionNoArg, "True" },
   { "+wobble",       ".wobble",      XrmoptionNoArg, "False" },
+  THREAD_OPTIONS
   { "-debug",        ".debug",       XrmoptionNoArg, "True" },
 };
 
@@ -386,7 +405,7 @@ draw_text (ModeInfo *mi, const char *string, GLfloat r, GLfloat th,
     {
       int w = texture_string_width (sp->texfont, line, 0);
       glPushMatrix();
-      glTranslatef ((max_w-w)/2, 0, 0);
+      glTranslatef ((max_w-w)/2, 0, polys * 4); /* 'polys' stops Z-fighting. */
 
       if (wire)
         {
@@ -430,7 +449,6 @@ draw_table (ModeInfo *mi)
   int th_steps = 36 * 4;    /* same as in draw_screen */
 
   static const GLfloat color[4]  = {0.0, 0.0, 0.0, 1.0};
-  static const GLfloat text[4]   = {0.15, 0.15, 0.15, 1.0};
   static const GLfloat spec[4]   = {0.0, 0.0, 0.0, 1.0};
   static const GLfloat shiny     = 0.0;
 
@@ -456,6 +474,20 @@ draw_table (ModeInfo *mi)
     }
   glEnd();
 
+  return polys;
+}
+
+
+static int
+draw_angles (ModeInfo *mi)
+{
+  int i;
+  int polys = 0;
+
+  static const GLfloat text[4]   = {0.15, 0.15, 0.15, 1.0};
+  static const GLfloat spec[4]   = {0.0, 0.0, 0.0, 1.0};
+
+  glMaterialfv (GL_FRONT, GL_SPECULAR,  spec);
   glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, text);
   glTranslatef (0, 0, 0.01);
   for (i = 0; i < 360; i += 10)
@@ -830,6 +862,53 @@ init_sonar (ModeInfo *mi)
 }
 
 
+# ifdef TEST_ASYNC_NETDB
+
+#   include <arpa/inet.h>
+
+static void _print_sockaddr (void *addr, socklen_t addrlen, FILE *stream)
+{
+  sa_family_t family = ((struct sockaddr *)addr)->sa_family;
+  char buf[256];
+  switch (family)
+    {
+    case AF_INET:
+      fputs (inet_ntoa(((struct sockaddr_in *)addr)->sin_addr), stream);
+      break;
+    case AF_INET6:
+      inet_ntop(family, &((struct sockaddr_in6 *)addr)->sin6_addr,
+                buf, sizeof (buf));
+      fputs (buf, stream);
+      break;
+    default:
+      abort();
+      break;
+    }
+}
+
+static void _print_error (int gai_error, int errno_error, FILE *stream)
+{
+  fputs (gai_error == EAI_SYSTEM ? strerror(errno_error) : gai_strerror(gai_error), stream);
+}
+
+#   if ASYNC_NETDB_USE_GAI
+
+static void _print_thread (pthread_t thread, FILE *stream)
+{
+#     ifdef __linux__
+    fprintf (stream, "%#lx", thread);
+#     elif defined __APPLE__ && defined __MACH__
+    fprintf (stream, "%p", thread);
+#     else
+    putc ('?', stream);
+#     endif
+}
+
+#   endif /* ASYNC_NETDB_USE_GAI */
+
+# endif /* TEST_ASYNC_NETDB */
+
+
 static void
 init_sensor (ModeInfo *mi)
 {
@@ -857,6 +936,90 @@ init_sensor (ModeInfo *mi)
                                      debug_p);
   if (!sp->ssd)
     abort();
+
+# if TEST_ASYNC_NETDB
+  /*
+     For extremely mysterious reasons, setuid apparently causes
+     pthread_join(3) to deadlock.
+     A rough guess at the sequence of events:
+     1. Worker thread is created.
+     2. Worker thread exits.
+     3. setuid(getuid()) is called.
+     4. pthread_join is called slightly later.
+
+     This may have something to do with glibc's use of SIGSETXID.
+   */
+
+  putc ('\n', stderr);
+
+#   if !ASYNC_NETDB_USE_GAI
+  fputs ("Warning: getaddrinfo() was not available at compile time.\n", stderr);
+#   endif
+
+  {
+    static const unsigned long addresses[] =
+      {
+        INADDR_LOOPBACK,
+        0x00010203,
+        0x08080808
+      };
+    struct sockaddr_in addr;
+    addr.sin_family = AF_INET;
+    addr.sin_port = 0;
+    addr.sin_addr.s_addr = htonl (addresses[random () % 3]);
+
+    sp->query0 = async_name_from_addr_start (MI_DISPLAY (mi), (void *)&addr,
+                                             sizeof(addr));
+    assert (sp->query0);
+    if (sp->query0)
+      {
+        fputs ("Looking up hostname from address: ", stderr);
+        _print_sockaddr (&addr, sizeof(addr), stderr);
+#   if ASYNC_NETDB_USE_GAI
+        fputs (" @ ", stderr);
+        _print_thread (sp->query0->io.thread, stderr);
+#   endif
+        putc ('\n', stderr);
+      }
+
+    if (!(random () & 3))
+      {
+        fputs ("Aborted hostname lookup (early)\n", stderr);
+        async_name_from_addr_cancel (sp->query0);
+        sp->query0 = NULL;
+      }
+  }
+
+  {
+    static const char *const hosts[] =
+      {
+        "example.com",
+        "invalid",
+        "ip6-localhost"
+      };
+    const char *host = hosts[random () % 3];
+
+    sp->query1 = async_addr_from_name_start (MI_DISPLAY(mi), host);
+
+    assert (sp->query1);
+
+    fprintf (stderr, "Looking up address from hostname: %s", host);
+#   if ASYNC_NETDB_USE_GAI
+    fputs (" @ ", stderr);
+    _print_thread (sp->query1->io.thread, stderr);
+#   endif
+    putc ('\n', stderr);
+
+    if (!(random () & 3))
+      {
+        fputs ("Aborted address lookup (early)\n", stderr);
+        async_addr_from_name_cancel (sp->query1);
+        sp->query1 = NULL;
+      }
+  }
+
+  fflush (stderr);
+# endif
 }
 
 
@@ -948,6 +1111,10 @@ draw_sonar (ModeInfo *mi)
   glCallList (sp->grid_list);
   mi->polygon_count += sp->screen_polys;
 
+  glPushMatrix();
+  mi->polygon_count += draw_angles (mi);               /* angles */
+  glPopMatrix();
+
   if (sp->desc)                                                /* local subnet */
     {
       glPushMatrix();
@@ -982,6 +1149,72 @@ draw_sonar (ModeInfo *mi)
   glFinish();
 
   glXSwapBuffers(dpy, window);
+
+# if TEST_ASYNC_NETDB
+  if(sp->query0 && async_name_from_addr_is_done (sp->query0))
+    {
+      if (!(random () & 3))
+        {
+          fputs ("Aborted hostname lookup (late)\n", stderr);
+          async_name_from_addr_cancel (sp->query0);
+        }
+      else
+        {
+          char *hostname = NULL;
+          int errno_error;
+          int gai_error = async_name_from_addr_finish (sp->query0, &hostname,
+                                                       &errno_error);
+
+          if(gai_error)
+            {
+              fputs ("Couldn't get hostname: ", stderr);
+              _print_error (gai_error, errno_error, stderr);
+              putc ('\n', stderr);
+            }
+          else
+            {
+              fprintf (stderr, "Got a hostname: %s\n", hostname);
+              free (hostname);
+            }
+        }
+
+      sp->query0 = NULL;
+    }
+
+  if(sp->query1 && async_addr_from_name_is_done (sp->query1))
+    {
+      if (!(random () & 3))
+        {
+          fputs ("Aborted address lookup (late)\n", stderr);
+          async_addr_from_name_cancel (sp->query1);
+        }
+      else
+        {
+          async_netdb_sockaddr_storage_t addr;
+          socklen_t addrlen;
+          int errno_error;
+          int gai_error = async_addr_from_name_finish (sp->query1, &addr,
+                                                       &addrlen, &errno_error);
+
+          if (gai_error)
+            {
+              fputs ("Couldn't get address: ", stderr);
+              _print_error (gai_error, errno_error, stderr);
+              putc ('\n', stderr);
+            }
+          else
+            {
+              fputs ("Got an address: ", stderr);
+              _print_sockaddr (&addr, addrlen, stderr);
+              putc ('\n', stderr);
+            }
+        }
+
+      sp->query1 = NULL;
+    }
+
+  fflush (stderr);
+# endif /* TEST_ASYNC_NETDB */
 }
 
 ENTRYPOINT void
index ff456cd4316b3ce9a1b5d8ec08d97e62e7614e9e..dee4541cefa1405b15c098d73dd9386241c8cf43 100644 (file)
 # include "config.h"
 #endif
 
-#ifndef HAVE_COCOA
+#ifdef HAVE_COCOA
+#elif defined(HAVE_ANDROID)
+# include <GLES/gl.h>
+#else  /* real X11 */
 # include <GL/gl.h>
 #endif
 
index efef9f8826cdd9f42bc83eaa224a71aa6ed62e99..3690c88e0ae1a63fc87fdd33c03fb404c0c2dc59 100644 (file)
@@ -63,7 +63,7 @@
 #define DEFAULTS "*delay:      30000       \n" \
                 "*showFPS:     False       \n" \
                 "*wireframe:   False       \n" \
-                "*labelfont:   -*-helvetica-medium-r-normal-*-180-*\n"
+        "*labelfont:   -*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*\n"
 
 # define refresh_spheremonics 0
 # define release_spheremonics 0
@@ -71,7 +71,7 @@
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
 #include "xlockmore.h"
-#include "glxfonts.h"
+#include "texfont.h"
 #include "normals.h"
 #include "colors.h"
 #include "rotator.h"
@@ -845,10 +845,9 @@ draw_spheremonics (ModeInfo *mi)
                cc->m[4], cc->m[5], cc->m[6], cc->m[7]);
 
       glColor3f(1.0, 1.0, 0.0);
-      print_gl_string (mi->dpy, cc->font_data,
-                       mi->xgwa.width, mi->xgwa.height,
-                       10, mi->xgwa.height - 10,
-                       buf, False);
+      print_texture_label (mi->dpy, cc->font_data,
+                           mi->xgwa.width, mi->xgwa.height,
+                           1, buf);
     }
 
   if (!static_parms)
index 42ccf2ba454b3641983665910afdc69067a0a2ea..11bbcf5f1a4e9b7721dba31738106c31009f1b16 100644 (file)
@@ -36,7 +36,7 @@ static const char sccsid[] = "@(#)sproingies.c        4.04 97/07/28 xlockmore";
 
 #ifdef USE_GL
 
-#ifndef HAVE_COCOA
+#if !defined(HAVE_COCOA) && !defined(HAVE_ANDROID)
 # include <GL/glu.h>
 #endif
 
index 1398c159c9bd28da58ef4664ae64c8e04059d69f..ac9790340291c5b35a718b7616070d03c343c499 100644 (file)
                 "*showFPS:  False     \n" \
                 "*fpsTop:   True      \n" \
                 "*usePty:   False     \n" \
+                "*texFontCacheSize: 300\n" \
                 "*font:   " DEF_FONT "\n" \
-                "*textLiteral: " DEF_TEXT "\n"
-
+                "*textLiteral: " DEF_TEXT "\n" \
+                "*program: xscreensaver-text --cols 0"  /* don't wrap */
 
 # define refresh_sws 0
 # define sws_handle_event 0
@@ -52,6 +53,7 @@
 
 #include "xlockmore.h"
 #include "textclient.h"
+#include "utf8wc.h"
 
 #ifdef USE_GL /* whole file */
 
@@ -64,7 +66,6 @@
 # endif
 
 
-#define DEF_PROGRAM    "xscreensaver-text --cols 0"  /* don't wrap */
 #define DEF_LINES      "125"
 #define DEF_STEPS      "35"
 #define DEF_SPIN       "0.03"
 #define DEF_TEXTURES   "True"
 #define DEF_DEBUG      "False"
 
-/* Utopia 800 needs 64 512x512 textures (4096x4096 bitmap).
-   Utopia 720 needs 16 512x512 textures (2048x2048 bitmap).
-   Utopia 480 needs 16 512x512 textures (2048x2048 bitmap).
-   Utopia 400 needs  4 512x512 textures (1024x1024 bitmap).
-   Utopia 180 needs  1 512x512 texture.
-   Times  240 needs  1 512x512 texture.
- */
-#define DEF_FONT       "-*-utopia-bold-r-normal-*-*-720-*-*-*-*-iso8859-1"
+#define DEF_FONT       "-*-utopia-bold-r-normal-*-*-360-*-*-*-*-*-*"
 
 #define TAB_WIDTH        8
 
@@ -107,7 +101,6 @@ typedef struct {
 
   GLuint text_list, star_list;
   texture_font_data *texfont;
-  int polygon_count;
   text_data *tc;
 
   char *buf;
@@ -132,7 +125,6 @@ typedef struct {
 
 static sws_configuration *scs = NULL;
 
-static char *program;
 static int max_lines;
 static int scroll_steps;
 static float star_spin;
@@ -148,7 +140,6 @@ static char *alignment_str;
 static int alignment;
 
 static XrmOptionDescRec opts[] = {
-  {"-program",     ".program",   XrmoptionSepArg, 0 },
   {"-lines",       ".lines",     XrmoptionSepArg, 0 },
   {"-steps",       ".steps",     XrmoptionSepArg, 0 },
   {"-spin",        ".spin",      XrmoptionSepArg, 0 },
@@ -174,7 +165,6 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-  {&program,        "program",   "Program",    DEF_PROGRAM,   t_String},
   {&max_lines,      "lines",     "Integer",    DEF_LINES,     t_Int},
   {&scroll_steps,   "steps",     "Integer",    DEF_STEPS,     t_Int},
   {&star_spin,      "spin",      "Float",      DEF_SPIN,      t_Float},
@@ -254,32 +244,6 @@ strip (char *s, Bool leading, Bool trailing)
 }
 
 
-/* The GLUT font only has ASCII characters in them, so do what we can to
-   convert Latin1 characters to the nearest ASCII equivalent... 
- */
-static void
-latin1_to_ascii (char *s)
-{
-  unsigned char *us = (unsigned char *) s;
-  const unsigned char ascii[95] = {
-    '!', 'C', '#', '#', 'Y', '|', 'S', '_', 'C', '?', '<', '=', '-', 'R', '_',
-    '?', '?', '2', '3', '\'','u', 'P', '.', ',', '1', 'o', '>', '?', '?', '?',
-    '?', 'A', 'A', 'A', 'A', 'A', 'A', 'E', 'C', 'E', 'E', 'E', 'E', 'I', 'I',
-    'I', 'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'x', '0', 'U', 'U', 'U', 'U',
-    'Y', 'p', 'S', 'a', 'a', 'a', 'a', 'a', 'a', 'e', 'c', 'e', 'e', 'e', 'e',
-    'i', 'i', 'i', 'i', 'o', 'n', 'o', 'o', 'o', 'o', 'o', '/', 'o', 'u', 'u',
-    'u', 'u', 'y', 'p', 'y' };
-  while (*us)
-    {
-      if (*us >= 161)
-        *us = ascii[*us - 161];
-      else if (*us > 127)
-        *us = '?';
-      us++;
-    }
-}
-
-
 static int
 sw_string_width (sws_configuration *sc, const char *s)
 {
@@ -368,7 +332,12 @@ get_more_lines (sws_configuration *sc)
           sc->lines[sc->total_lines][L] = 0;
 
           if (!textures_p)
-            latin1_to_ascii (sc->lines[sc->total_lines]);
+            {
+              /* The GLUT font only has ASCII characters. */
+              char *s1 = utf8_to_latin1 (sc->lines[sc->total_lines], True);
+              free (sc->lines[sc->total_lines]);
+              sc->lines[sc->total_lines] = s1;
+            }
 
           {
             char *t = sc->lines[sc->total_lines];
@@ -431,20 +400,19 @@ draw_string (sws_configuration *sc, GLfloat x, GLfloat y, const char *s)
 
   if (debug_p)
     {
-      GLfloat w;
       GLfloat h = sc->line_height / sc->font_scale;
-      char c[2];
-      c[1]=0;
-      s = os;
+      char **chars = utf8_split (os, 0);
+      int i;
+
       if (textures_p) glDisable (GL_TEXTURE_2D);
       glLineWidth (1);
       glColor3f (0.4, 0.4, 0.4);
       glPushMatrix ();
       glTranslatef (x, y, 0);
-      while (*s)
+      for (i = 0; chars[i]; i++)
         {
-          *c = *s++;
-          w = sw_string_width (sc, c);
+          GLfloat w = sw_string_width (sc, chars[i]);
+          free (chars[i]);
           glBegin (GL_LINE_LOOP);
           glVertex3f (0, 0, 0);
           glVertex3f (w, 0, 0);
@@ -453,6 +421,7 @@ draw_string (sws_configuration *sc, GLfloat x, GLfloat y, const char *s)
           glEnd();
           glTranslatef (w, 0, 0);
         }
+      free (chars);
       glPopMatrix ();
       if (textures_p) glEnable (GL_TEXTURE_2D);
     }
@@ -670,8 +639,6 @@ gl_init (ModeInfo *mi)
 {
   sws_configuration *sc = &scs[MI_SCREEN(mi)];
 
-  program = get_string_resource (mi->dpy, "program", "Program");
-
   glDisable (GL_LIGHTING);
   glDisable (GL_DEPTH_TEST);
 
@@ -788,12 +755,16 @@ init_sws (ModeInfo *mi)
   sc->line_height = font_height * sc->font_scale;
 
 
-  /* Buffer only two lines of text.
+  /* Buffer only a few lines of text.
      If the buffer is too big, there's a significant delay between
      when the program launches and when the text appears, which can be
      irritating for time-sensitive output (clock, current music, etc.)
+
+     I'd like to buffer only 2 lines, but we need to assume that we
+     could get a whole line of N-byte Unicrud, and if we fill the buffer
+     before hitting the end of the line, we stall.
    */
-  sc->buf_size = target_columns * 2;
+  sc->buf_size = target_columns * 2 * 4;
   if (sc->buf_size < 80) sc->buf_size = 80;
   sc->buf = (char *) calloc (1, sc->buf_size);
 
@@ -914,14 +885,78 @@ draw_sws (ModeInfo *mi)
         }
       if (textures_p) glEnable (GL_TEXTURE_2D);
       glPopMatrix ();
+      check_gl_error ("debug render");
     }
 
   /* Scroll to current position */
   glTranslatef (0.0, sc->intra_line_scroll, 0.0);
 
   glColor3f (1.0, 1.0, 0.4);
-  glCallList (sc->text_list);
-  mi->polygon_count = sc->polygon_count;
+
+  mi->polygon_count = 0;
+
+  glPushMatrix ();
+  glScalef (sc->font_scale, sc->font_scale, sc->font_scale);
+  for (i = 0; i < sc->total_lines; i++)
+    {
+      double fade = (fade_p ? 1.0 * i / sc->total_lines : 1.0);
+      int offscreen_lines = 2;
+
+      double x = -0.5;
+      double y =  ((sc->total_lines - (i + offscreen_lines) - 1)
+                   * sc->line_height);
+      double xoff = 0;
+      char *line = sc->lines[i];
+
+      if (debug_p)
+        {
+          double xx = x * 1.4;  /* a little more to the left */
+          char n[20];
+          sprintf(n, "%d:", i);
+          draw_string (sc, xx / sc->font_scale, y / sc->font_scale, n);
+        }
+
+      if (!line || !*line)
+        continue;
+
+      if (sc->line_thickness != 1 && !textures_p)
+        {
+          int max_thick_lines = MAX_THICK_LINES;
+          GLfloat thinnest_line = 1.0;
+          GLfloat thickest_line = sc->line_thickness;
+          GLfloat range = thickest_line - thinnest_line;
+          GLfloat thickness;
+
+          int j = sc->total_lines - i - 1;
+
+          if (j > max_thick_lines)
+            thickness = thinnest_line;
+          else
+            thickness = (thinnest_line +
+                         (range * ((max_thick_lines - j) /
+                                   (GLfloat) max_thick_lines)));
+
+          glLineWidth (thickness);
+        }
+
+      if (alignment >= 0)
+        {
+          int n = sw_string_width (sc, line);
+          xoff = 1.0 - (n * sc->font_scale);
+        }
+
+      if (alignment == 0)
+        xoff /= 2;
+
+      glColor3f (fade, fade, 0.5 * fade);
+      draw_string (sc, (x + xoff) / sc->font_scale, y / sc->font_scale,
+                   line);
+      if (textures_p)
+        mi->polygon_count += strlen (line);
+    }
+  glPopMatrix ();
+
+
 
   sc->intra_line_scroll += sc->line_height / scroll_steps;
 
@@ -949,72 +984,6 @@ draw_sws (ModeInfo *mi)
            here so that new text still pulls in from the bottom of
            the screen, isntead of just appearing. */
         sc->total_lines = max_lines;
-
-      glDeleteLists (sc->text_list, 1);
-      sc->text_list = glGenLists (1);
-      glNewList (sc->text_list, GL_COMPILE);
-      sc->polygon_count = 0;
-      glPushMatrix ();
-      glScalef (sc->font_scale, sc->font_scale, sc->font_scale);
-      for (i = 0; i < sc->total_lines; i++)
-        {
-          double fade = (fade_p ? 1.0 * i / sc->total_lines : 1.0);
-          int offscreen_lines = 2;
-
-          double x = -0.5;
-          double y =  ((sc->total_lines - (i + offscreen_lines) - 1)
-                       * sc->line_height);
-          double xoff = 0;
-          char *line = sc->lines[i];
-
-          if (debug_p)
-            {
-              double xx = x * 1.4;  /* a little more to the left */
-              char n[20];
-              sprintf(n, "%d:", i);
-              draw_string (sc, xx / sc->font_scale, y / sc->font_scale, n);
-            }
-
-          if (!line || !*line)
-            continue;
-
-          if (sc->line_thickness != 1 && !textures_p)
-            {
-              int max_thick_lines = MAX_THICK_LINES;
-              GLfloat thinnest_line = 1.0;
-              GLfloat thickest_line = sc->line_thickness;
-              GLfloat range = thickest_line - thinnest_line;
-              GLfloat thickness;
-
-              int j = sc->total_lines - i - 1;
-
-              if (j > max_thick_lines)
-                thickness = thinnest_line;
-              else
-                thickness = (thinnest_line +
-                             (range * ((max_thick_lines - j) /
-                                       (GLfloat) max_thick_lines)));
-
-              glLineWidth (thickness);
-            }
-
-          if (alignment >= 0)
-            {
-              int n = sw_string_width (sc, line);
-              xoff = 1.0 - (n * sc->font_scale);
-            }
-
-          if (alignment == 0)
-            xoff /= 2;
-
-          glColor3f (fade, fade, 0.5 * fade);
-          draw_string (sc, (x + xoff) / sc->font_scale, y / sc->font_scale,
-                       line);
-          if (textures_p)
-            sc->polygon_count += strlen (line);
-        }
-      glPopMatrix ();
-      glEndList ();
     }
 
   glPopMatrix ();
index fc2931d4a4bc5d81e9e2eef4ac7c1cdc88dd5c3d..8639f10c0da0429efb47451c37af6d58484060b4 100644 (file)
 #include <stdio.h>
 #include <stdlib.h>
 
-#ifndef HAVE_COCOA
-# include <GL/gl.h>
-#endif
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
-
 #include "yarandom.h"
 #include "stonerview.h"
 
@@ -103,10 +95,10 @@ void
 stonerview_move_increment(stonerview_state *st)
 {
   int ix, val;
-/*  GLfloat fval; */
-/*  GLfloat recipels = (1.0 / (GLfloat)st->num_els); */
-  GLfloat pt[2];
-  GLfloat ptrad, pttheta;
+/*  double fval; */
+/*  double recipels = (1.0 / (double)st->num_els); */
+  double pt[2];
+  double ptrad, pttheta;
     
   for (ix=0; ix<st->num_els; ix++) {
     stonerview_elem_t *el = &st->elist[ix];
@@ -114,7 +106,7 @@ stonerview_move_increment(stonerview_state *st)
     /* Grab r and theta... */
     val = osc_get(st, st->theta, ix);
     pttheta = val * (0.01 * M_PI / 180.0); 
-    ptrad = (GLfloat)osc_get(st, st->rad, ix) * 0.001;
+    ptrad = (double)osc_get(st, st->rad, ix) * 0.001;
     /* And convert them to x,y coordinates. */
     pt[0] = ptrad * cos(pttheta);
     pt[1] = ptrad * sin(pttheta);
@@ -122,7 +114,7 @@ stonerview_move_increment(stonerview_state *st)
     /* Set x,y,z. */
     el->pos[0] = pt[0];
     el->pos[1] = pt[1];
-    el->pos[2] = (GLfloat)osc_get(st, st->alti, ix) * 0.001;
+    el->pos[2] = (double)osc_get(st, st->alti, ix) * 0.001;
         
     /* Set which way the square is rotated. This is fixed for now, although
        it would be trivial to make the squares spin as they revolve. */
@@ -133,19 +125,19 @@ stonerview_move_increment(stonerview_state *st)
        converting an HSV value to RGB, where S and V are always 1. */
     val = osc_get(st, st->color, ix);
     if (val < 1200) {
-      el->col[0] = ((GLfloat)val / 1200.0);
+      el->col[0] = ((double)val / 1200.0);
       el->col[1] = 0;
-      el->col[2] = (GLfloat)(1200 - val) / 1200.0;
+      el->col[2] = (double)(1200 - val) / 1200.0;
     } 
     else if (val < 2400) {
-      el->col[0] = (GLfloat)(2400 - val) / 1200.0;
-      el->col[1] = ((GLfloat)(val - 1200) / 1200.0);
+      el->col[0] = (double)(2400 - val) / 1200.0;
+      el->col[1] = ((double)(val - 1200) / 1200.0);
       el->col[2] = 0;
     }
     else {
       el->col[0] = 0;
-      el->col[1] = (GLfloat)(3600 - val) / 1200.0;
-      el->col[2] = ((GLfloat)(val - 2400) / 1200.0);
+      el->col[1] = (double)(3600 - val) / 1200.0;
+      el->col[2] = ((double)(val - 2400) / 1200.0);
     }
     el->col[3] = 1.0;
   }
index a3e0acd281c5899fb7d8fd54aecc153e7380e480..82073e909143f2ffb670351091aedf528c36fa83 100644 (file)
@@ -14,9 +14,9 @@
 #define __STONERVIEW_MOVE_H__
 
 typedef struct {
-  GLfloat pos[3];
-  GLfloat vervec[2];
-  GLfloat col[4];
+  double pos[3];
+  double vervec[2];
+  double col[4];
 } stonerview_elem_t;
 
 extern void stonerview_init_move(stonerview_state *);
index d66eab28ce505ac2a271f448a7f3841ddcb88651..baf40e4179364497e1ba8260d0c15ec650e685aa 100644 (file)
 # include "config.h"
 #endif
 
+#ifdef HAVE_COCOA
+# include "jwxyz.h"
+#elif defined(HAVE_ANDROID)
+# include <GLES/gl.h>
+#else /* real Xlib */
+# include <GL/glx.h>
+# include <GL/glu.h>
+#endif /* !HAVE_COCOA */
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
 #include <stdlib.h>
 #include "stonerview.h"
 
@@ -95,7 +108,12 @@ stonerview_win_draw(stonerview_state *st)
     if (st->wireframe) continue;
 
     /* fill the square */
-    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, el->col);
+    {
+      GLfloat col[4];
+      col[0] = el->col[0]; col[1] = el->col[1];
+      col[2] = el->col[2]; col[3] = el->col[3];
+      glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, col);
+    }
     glBegin(GL_QUADS);
     glVertex3f(el->pos[0]-el->vervec[0], el->pos[1]-el->vervec[1], el->pos[2]);
     glVertex3f(el->pos[0]+el->vervec[1], el->pos[1]-el->vervec[0], el->pos[2]);
index afbd53c51e8ff1422fd6df9cfb94093d30d9d630..0afd7a65c79e4e77748be8a9564761e10ad93adc 100644 (file)
 # include "config.h"
 #endif /* HAVE_CONFIG_H */
 
-#ifndef HAVE_COCOA
-# include <GL/gl.h>
-#endif
-
-#ifdef HAVE_JWZGLES
-# include "jwzgles.h"
-#endif /* HAVE_JWZGLES */
-
 typedef struct stonerview_state stonerview_state;
 
 #include "stonerview-osc.h"
index e05a80438e88b046d14471056a848de8c7585bdd..8fab0493efbbf2f903d61718900dd1db5a4c3ad6 100644 (file)
@@ -1,4 +1,4 @@
-/* tangram, Copyright (c) 2005 Jeremy English <jhe@jeremyenglish.org>
+/* tangram, Copyright (c) 2005-2014 Jeremy English <jhe@jeremyenglish.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software
  * and its documentation for any purpose is hereby granted without
@@ -18,9 +18,9 @@
 
 #define DEFAULTS       "*delay:        10000            \n" \
                        "*wireframe:    False         \n" \
-                       "*titleFont:  -*-helvetica-medium-r-normal-*-180-*\n" \
-                       "*titleFont2: -*-helvetica-medium-r-normal-*-120-*\n" \
-                       "*titleFont3: -*-helvetica-medium-r-normal-*-80-*\n"  \
+       "*titleFont:  -*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*\n" \
+       "*titleFont2: -*-helvetica-medium-r-normal-*-*-120-*-*-*-*-*-*\n" \
+       "*titleFont3: -*-helvetica-medium-r-normal-*-*-80-*-*-*-*-*-*\n"  \
 
 # define refresh_tangram 0
 # define release_tangram 0
@@ -37,7 +37,7 @@
 #include <time.h>
 #include <math.h>
 #include "tangram_shapes.h"
-#include "glxfonts.h"
+#include "texfont.h"
 
 typedef struct {
     GLubyte r;
@@ -98,9 +98,6 @@ typedef struct {
     int ccolor;
 
     texture_font_data *font1_data, *font2_data, *font3_data;
-
-    GLuint name_list;
-
     GLfloat theta[3];
     Bool going_down[3];
 
@@ -753,7 +750,22 @@ static void draw_shapes(ModeInfo * mi)
     draw_tangram_shape(tp->tlg2);
     draw_tangram_shape(tp->sq);
     draw_tangram_shape(tp->rh);
-    if (do_labels) glCallList(tp->name_list);
+
+    if (do_labels)
+      {
+        texture_font_data *f;
+        if (MI_WIDTH(mi) >= 500 && MI_HEIGHT(mi) >= 375)
+            f = tp->font1_data;
+        else if (MI_WIDTH(mi) >= 350 && MI_HEIGHT(mi) >= 260)
+            f = tp->font2_data;
+        else
+            f = tp->font3_data;
+
+        glColor3f(0.8, 0.8, 0);
+        print_texture_label (mi->dpy, f,
+                             mi->xgwa.width, mi->xgwa.height,
+                             1, tp->pn);
+      }
 }
 
 static void set_perspective(void)
@@ -889,8 +901,6 @@ ENTRYPOINT void init_tangram(ModeInfo * mi)
 
     wire = MI_IS_WIREFRAME(mi);
 
-    tp->name_list = glGenLists(1);
-
     load_fonts(mi);
     init_shapes(mi);
 
@@ -1028,23 +1038,6 @@ ENTRYPOINT void draw_tangram(ModeInfo * mi)
     glPushMatrix();
 
     glLoadIdentity();
-    if (do_labels)
-      {
-        texture_font_data *f;
-        if (MI_WIDTH(mi) >= 500 && MI_HEIGHT(mi) >= 375)
-            f = tp->font1_data;
-        else if (MI_WIDTH(mi) >= 350 && MI_HEIGHT(mi) >= 260)
-            f = tp->font2_data;
-        else
-            f = tp->font3_data;
-
-        glNewList(tp->name_list, GL_COMPILE);
-        glColor3f(0.8, 0.8, 0);
-        print_gl_string(mi->dpy, f,
-                        mi->xgwa.width, mi->xgwa.height,
-                        10, mi->xgwa.height - 10, tp->pn, False);
-        glEndList();
-      }
 
     glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, white);
     glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 128);
index 8f39ea86bddfb08778255a089e518eb9dd412759..0602344de7a779284a0d0381fcdae1a0663cdd7f 100644 (file)
@@ -27,6 +27,9 @@
 # else
 #  include <OpenGL/glu.h>
 # endif
+#elif defined(HAVE_ANDROID)
+# include <GLES/gl.h>
+# include "jwzgles.h"
 #else
 # include <GL/glx.h>
 # include <GL/glu.h>
 # include "jwzgles.h"
 #endif /* HAVE_JWZGLES */
 
+#ifdef HAVE_XSHM_EXTENSION
+# include "xshm.h"
+#endif /* HAVE_XSHM_EXTENSION */
+
+#include "xft.h"
 #include "resources.h"
 #include "texfont.h"
+#include "fps.h"       /* for current_device_rotation() */
 
-#define DO_SUBSCRIPTS
+#undef HAVE_XSHM_EXTENSION  /* doesn't actually do any good here */
 
 
 /* These are in xlock-gl.c */
@@ -49,17 +58,28 @@ extern void check_gl_error (const char *type);
 /* screenhack.h */
 extern char *progname;
 
+/* LRU cache of textures, to optimize the case where we're drawing the
+   same strings repeatedly.
+ */
+typedef struct texfont_cache texfont_cache;
+struct texfont_cache {
+  char *string;
+  GLuint texid;
+  int width, height;
+  int width2, height2;
+  texfont_cache *next;
+};
+
 struct texture_font_data {
   Display *dpy;
-  XFontStruct *font;
-  int cell_width, cell_height;  /* maximal charcell */
-  int tex_width, tex_height;    /* size of each texture */
+  XftFont *xftfont;
+  int cache_size;
+  texfont_cache *cache;
+};
 
-  int grid_mag;                        /* 1,  2,  4, or 8 */
-  int ntextures;               /* 1,  4, 16, or 64 (grid_mag ^ 2) */
 
-  GLuint texid[64];            /* must hold ntextures */
-};
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
 
 
 /* return the next larger power of 2. */
@@ -85,18 +105,32 @@ to_pow2 (int i)
    were drawn with antialiasing, that is preserved.
  */
 static void
-bitmap_to_texture (Display *dpy, Pixmap p, Visual *visual, int *wP, int *hP)
+bitmap_to_texture (Display *dpy, Pixmap p, Visual *visual, int depth,
+                   int *wP, int *hP)
 {
   Bool mipmap_p = True;
   int ow = *wP;
   int oh = *hP;
   int w2 = to_pow2 (ow);
   int h2 = to_pow2 (oh);
-  int x, y;
-  XImage *image = XGetImage (dpy, p, 0, 0, ow, oh, ~0L, ZPixmap);
+  int x, y, max, scale;
+  XImage *image = 0;
   unsigned char *data = (unsigned char *) calloc (w2 * 2, (h2 + 1));
   unsigned char *out = data;
 
+  /* If either dimension is larger than the supported size, reduce.
+     We still return the old size to keep the caller's math working,
+     but the texture itself will have fewer pixels in it.
+   */
+  glGetIntegerv (GL_MAX_TEXTURE_SIZE, &max);
+  scale = 1;
+  while (w2 > max || h2 > max)
+    {
+      w2 /= 2;
+      h2 /= 2;
+      scale *= 2;
+    }
+
   /* OpenGLES doesn't support GL_INTENSITY, so instead of using a
      texture with 1 byte per pixel, the intensity value, we have
      to use 2 bytes per pixel: solid white, and an alpha value.
@@ -114,6 +148,27 @@ bitmap_to_texture (Display *dpy, Pixmap p, Visual *visual, int *wP, int *hP)
 # endif
   GLuint type    = GL_UNSIGNED_BYTE;
 
+# ifdef HAVE_XSHM_EXTENSION
+  Bool use_shm = get_boolean_resource (dpy, "useSHM", "Boolean");
+  XShmSegmentInfo shm_info;
+# endif /* HAVE_XSHM_EXTENSION */
+
+# ifdef HAVE_XSHM_EXTENSION
+# error XX
+  if (use_shm)
+    {
+      image = create_xshm_image (dpy, visual, depth, ZPixmap, 0, &shm_info,
+                                 ow, oh);
+      if (image)
+        XShmGetImage (dpy, p, image, 0, 0, ~0L);
+      else
+        use_shm = False;
+    }
+# endif /* HAVE_XSHM_EXTENSION */
+
+  if (!image)
+    image = XGetImage (dpy, p, 0, 0, ow, oh, ~0L, ZPixmap);
+
 # ifdef HAVE_JWZGLES
   /* This would work, but it's wasteful for no benefit. */
   mipmap_p = False;
@@ -121,18 +176,31 @@ bitmap_to_texture (Display *dpy, Pixmap p, Visual *visual, int *wP, int *hP)
 
   for (y = 0; y < h2; y++)
     for (x = 0; x < w2; x++) {
-      unsigned long pixel = (x >= ow || y >= oh ? 0 : XGetPixel (image, x, y));
+      /* Might be better to average a scale x scale square of source pixels,
+         but at the resolutions we're dealing with, this is probably good
+         enough. */
+      int sx = x * scale;
+      int sy = y * scale;
+      unsigned long pixel = (sx >= ow || sy >= oh ? 0 :
+                             XGetPixel (image, sx, sy));
       /* instead of averaging all three channels, let's just use red,
          and assume it was already grayscale. */
       unsigned long r = pixel & visual->red_mask;
       /* This goofy trick is to make any of RGBA/ABGR/ARGB work. */
       pixel = ((r >> 24) | (r >> 16) | (r >> 8) | r) & 0xFF;
 # ifndef GL_INTENSITY
-      *out++ = 0xFF;  /* 2 bytes per pixel */
+      *out++ = 0xFF;  /* 2 bytes per pixel (luminance, alpha) */
 # endif
       *out++ = pixel;
     }
-  XDestroyImage (image);
+
+# ifdef HAVE_XSHM_EXTENSION
+  if (use_shm)
+    destroy_xshm_image (dpy, image, &shm_info);
+  else
+# endif /* HAVE_XSHM_EXTENSION */
+    XDestroyImage (image);
+
   image = 0;
 
   if (mipmap_p)
@@ -148,170 +216,10 @@ bitmap_to_texture (Display *dpy, Pixmap p, Visual *visual, int *wP, int *hP)
     check_gl_error (msg);
   }
 
-
-  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
-                   mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR);
-
-
-  /* This makes scaled font pixmaps tolerable to look at.
-     LOD bias is part of OpenGL 1.4.
-     GL_EXT_texture_lod_bias has been present since the original iPhone.
-   */
-# if !defined(GL_TEXTURE_LOD_BIAS) && defined(GL_TEXTURE_LOD_BIAS_EXT)
-#   define GL_TEXTURE_LOD_BIAS GL_TEXTURE_LOD_BIAS_EXT
-# endif
-# ifdef GL_TEXTURE_LOD_BIAS
-  if (mipmap_p)
-    glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, 0.25);
-# endif
-  clear_gl_error();  /* invalid enum on iPad 3 */
-
-  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-
   free (data);
 
-  *wP = w2;
-  *hP = h2;
-}
-
-
-static texture_font_data *
-load_texture_xfont (Display *dpy, XFontStruct *f)
-{
-  Screen *screen = DefaultScreenOfDisplay (dpy);
-  Window root = RootWindowOfScreen (screen);
-  XWindowAttributes xgwa;
-  int which;
-  GLint old_texture = 0;
-  texture_font_data *data = 0;
-
-  glGetIntegerv (GL_TEXTURE_BINDING_2D, &old_texture);
-
-  XGetWindowAttributes (dpy, root, &xgwa);
-
-  data = (texture_font_data *) calloc (1, sizeof(*data));
-  data->dpy = dpy;
-  data->font = f;
-
-  /* Figure out how many textures to use.
-     E.g., if we need 1024x1024 bits, use four 512x512 textures,
-     to be gentle to machines with low texture size limits.
-   */
-  {
-    int w = to_pow2 (16 * (f->max_bounds.rbearing - f->min_bounds.lbearing));
-    int h = to_pow2 (16 * (f->max_bounds.ascent   + f->max_bounds.descent));
-    int i = (w > h ? w : h);
-
-    if      (i <= 512)  data->grid_mag = 1;  /*  1 tex of 16x16 chars */
-    else if (i <= 1024) data->grid_mag = 2;  /*  4 tex of 8x8 chars */
-    else if (i <= 2048) data->grid_mag = 4;  /* 16 tex of 4x4 chars */
-    else                data->grid_mag = 8;  /* 32 tex of 2x2 chars */
-
-    data->ntextures = data->grid_mag * data->grid_mag;
-
-# if 0
-    fprintf (stderr,
-             "%s: %dx%d grid of %d textures of %dx%d chars (%dx%d bits)\n",
-             progname,
-             data->grid_mag, data->grid_mag,
-             data->ntextures,
-             16 / data->grid_mag, 16 / data->grid_mag,
-             i, i);
-# endif
-  }
-
-  for (which = 0; which < data->ntextures; which++)
-    {
-      /* Create a pixmap big enough to fit every character in the font.
-         (modulo the "ntextures" scaling.)
-         Make it square-ish, since GL likes dimensions to be powers of 2.
-       */
-      XGCValues gcv;
-      GC gc;
-      Pixmap p;
-      int cw = f->max_bounds.rbearing - f->min_bounds.lbearing;
-      int ch = f->max_bounds.ascent   + f->max_bounds.descent;
-      int grid_size = (16 / data->grid_mag);
-      int w = cw * grid_size;
-      int h = ch * grid_size;
-      int i;
-
-      data->cell_width  = cw;
-      data->cell_height = ch;
-
-      p = XCreatePixmap (dpy, root, w, h, xgwa.depth);
-      gcv.font = f->fid;
-      gcv.foreground = BlackPixelOfScreen (xgwa.screen);
-      gcv.background = BlackPixelOfScreen (xgwa.screen);
-      gc = XCreateGC (dpy, p, (GCFont|GCForeground|GCBackground), &gcv);
-      XFillRectangle (dpy, p, gc, 0, 0, w, h);
-      XSetForeground (dpy, gc, WhitePixelOfScreen (xgwa.screen));
-      for (i = 0; i < 256 / data->ntextures; i++)
-        {
-          int ii = (i + (which * 256 / data->ntextures));
-          char c = (char) ii;
-          int x = (i % grid_size) * cw;
-          int y = (i / grid_size) * ch;
-
-          /* See comment in print_texture_string for bit layout explanation.
-           */
-          int lbearing = (f->per_char && ii >= f->min_char_or_byte2
-                          ? f->per_char[ii - f->min_char_or_byte2].lbearing
-                          : f->min_bounds.lbearing);
-          int ascent   = (f->per_char && ii >= f->min_char_or_byte2
-                          ? f->per_char[ii - f->min_char_or_byte2].ascent
-                          : f->max_bounds.ascent);
-          int width    = (f->per_char && ii >= f->min_char_or_byte2
-                          ? f->per_char[ii - f->min_char_or_byte2].width
-                          : f->max_bounds.width);
-
-          if (width == 0) continue;
-          XDrawString (dpy, p, gc, x - lbearing, y + ascent, &c, 1);
-        }
-      XFreeGC (dpy, gc);
-
-      glGenTextures (1, &data->texid[which]);
-      glBindTexture (GL_TEXTURE_2D, data->texid[which]);
-      check_gl_error ("texture font load");
-      data->tex_width  = w;
-      data->tex_height = h;
-
-#if 0  /* debugging: write the bitmap to a pgm file */
-      {
-        char file[255];
-        XImage *image;
-        int x, y;
-        FILE *ff;
-        sprintf (file, "/tmp/%02d.pgm", which);
-        image = XGetImage (dpy, p, 0, 0, w, h, ~0L, ZPixmap);
-        ff = fopen (file, "w");
-        fprintf (ff, "P5\n%d %d\n255\n", w, h);
-        for (y = 0; y < h; y++)
-          for (x = 0; x < w; x++) {
-            unsigned long pix = XGetPixel (image, x, y);
-            unsigned long r = (pix & xgwa.visual->red_mask);
-            r = ((r >> 24) | (r >> 16) | (r >> 8) | r);
-            fprintf (ff, "%c", (char) r);
-          }
-        fclose (ff);
-        XDestroyImage (image);
-        fprintf (stderr, "%s: wrote %s (%d x %d)\n", progname, file,
-                 f->max_bounds.rbearing - f->min_bounds.lbearing,
-                 f->max_bounds.ascent   + f->max_bounds.descent);
-      }
-#endif /* 0 */
-
-      bitmap_to_texture (dpy, p, xgwa.visual, 
-                         &data->tex_width, &data->tex_height);
-      XFreePixmap (dpy, p);
-    }
-
-  /* Reset to the caller's default */
-  glBindTexture (GL_TEXTURE_2D, old_texture);
-
-  return data;
+  *wP = w2 * scale;
+  *hP = h2 * scale;
 }
 
 
@@ -321,26 +229,37 @@ load_texture_xfont (Display *dpy, XFontStruct *f)
 texture_font_data *
 load_texture_font (Display *dpy, char *res)
 {
+  int screen = DefaultScreen (dpy);
   char *font = get_string_resource (dpy, res, "Font");
-  const char *def1 = "-*-helvetica-medium-r-normal-*-240-*";
-  const char *def2 = "-*-helvetica-medium-r-normal-*-180-*";
+  const char *def1 = "-*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*";
+  const char *def2 = "-*-helvetica-medium-r-normal-*-*-140-*-*-*-*-*-*";
   const char *def3 = "fixed";
-  XFontStruct *f;
+  XftFont *f = 0;
+  texture_font_data *data;
+  int cache_size = get_integer_resource (dpy, "texFontCacheSize", "Integer");
 
-  if (!strcmp (res, "fpsFont"))
-    def1 = "-*-courier-bold-r-normal-*-180-*";  /* Kludge. Sue me. */
+  /* Hacks that draw a lot of different strings on the screen simultaneously,
+     like Star Wars, should set this to a larger value for performance. */
+  if (cache_size <= 0)
+    cache_size = 30;
 
   if (!res || !*res) abort();
+
+  if (!strcmp (res, "fpsFont")) {  /* Kludge. */
+    def1 = "-*-courier-bold-r-normal-*-*-140-*-*-*-*-*-*";
+    cache_size = 0;  /* No need for a cache on FPS: already throttled. */
+  }
+
   if (!font) font = strdup(def1);
 
-  f = XLoadQueryFont(dpy, font);
+  f = XftFontOpenXlfd (dpy, screen, font);
   if (!f && !!strcmp (font, def1))
     {
       fprintf (stderr, "%s: unable to load font \"%s\", using \"%s\"\n",
                progname, font, def1);
       free (font);
       font = strdup (def1);
-      f = XLoadQueryFont(dpy, font);
+      f = XftFontOpenXlfd (dpy, screen, font);
     }
 
   if (!f && !!strcmp (font, def2))
@@ -349,7 +268,7 @@ load_texture_font (Display *dpy, char *res)
                progname, font, def2);
       free (font);
       font = strdup (def2);
-      f = XLoadQueryFont(dpy, font);
+      f = XftFontOpenXlfd (dpy, screen, font);
     }
 
   if (!f && !!strcmp (font, def3))
@@ -358,51 +277,177 @@ load_texture_font (Display *dpy, char *res)
                progname, font, def3);
       free (font);
       font = strdup (def3);
-      f = XLoadQueryFont(dpy, font);
+      f = XftFontOpenXlfd (dpy, screen, font);
     }
 
   if (!f)
     {
       fprintf (stderr, "%s: unable to load fallback font \"%s\" either!\n",
                progname, font);
-      exit (1);
+      abort();
     }
 
   free (font);
   font = 0;
 
-  return load_texture_xfont (dpy, f);
+  data = (texture_font_data *) calloc (1, sizeof(*data));
+  data->dpy = dpy;
+  data->xftfont = f;
+  data->cache_size = cache_size;
+
+  return data;
 }
 
 
-/* Bounding box of the multi-line string, in pixels.
+/* Measure the string, or render it, depending on whether the XftDraw
+   is supplied.
  */
-int
-texture_string_width (texture_font_data *data, const char *c, int *height_ret)
+static int
+iterate_texture_string (texture_font_data *data,
+                        const char *s, 
+                        XftDraw *xftdraw, XftColor *xftcolor,
+                        int x, int y,
+                        int *height_ret)
 {
-  XFontStruct *f = data->font;
-  int x = 0;
-  int max_w = 0;
-  int lh = f->ascent + f->descent;
-  int h = lh;
-  while (*c)
+  int line_height = data->xftfont->ascent + data->xftfont->descent;
+  int left = x;
+  int max_x, ox, oy;
+  const char *os = s;
+  Bool sub_p = False, osub_p = False;
+  int cw = 0, tabs = 0;
+  XGlyphInfo extents;
+
+  y += line_height;
+  max_x = x;
+  ox = x;
+  oy = y;
+
+  while (1)
     {
-      int cc = *((unsigned char *) c);
-      if (*c == '\n')
+      if (*s == 0 ||
+          *s == '\n' ||
+          *s == '\t' ||
+          (*s == '[' && isdigit(s[1])) ||
+          (*s == ']' && sub_p))
         {
-          if (x > max_w) max_w = x;
-          x = 0;
-          h += lh;
+          if (s == os)
+            extents.xOff = 0;
+          else
+            XftTextExtentsUtf8 (data->dpy, data->xftfont,
+                                (FcChar8 *) os, (int) (s - os),
+                                &extents);
+          x += extents.xOff;
+          if (x > max_x)
+            max_x = x;
+
+          if (*s == '\n')
+            {
+              x = left;
+              y += line_height;
+              sub_p = False;
+            }
+          else if (*s == '\t')
+            {
+              if (! cw)
+                {
+                  /* Measure "m" to determine tab width. */
+                  XftTextExtentsUtf8 (data->dpy, data->xftfont,
+                                      (FcChar8 *) "m", 1, &extents);
+                  cw = extents.xOff;
+                  if (cw <= 0) cw = 1;
+                  tabs = cw * 7;
+                }
+              x = ((x + tabs) / tabs) * tabs;
+            }
+          else if (*s == '[' && isdigit(s[1]))
+            sub_p = True;
+          else if (*s == ']' && sub_p)
+            sub_p = False;
+
+          if (xftdraw && s != os)
+            XftDrawStringUtf8 (xftdraw, xftcolor, data->xftfont,
+                               ox, 
+                               oy + (int) (osub_p ? line_height * 0.3 : 0),
+                               (FcChar8 *) os, (int) (s - os));
+          if (!*s) break;
+          os = s+1;
+          ox = x;
+          oy = y;
+          osub_p = sub_p;
         }
-      else
-        x += (f->per_char
-              ? f->per_char[cc-f->min_char_or_byte2].width
-              : f->min_bounds.rbearing);
-      c++;
+      s++;
+    }
+
+  if (height_ret)
+    *height_ret = y;
+  return max_x;
+}
+
+
+/* Bounding box of the multi-line string, in pixels.
+ */
+int
+texture_string_width (texture_font_data *data, const char *s, int *height_ret)
+{
+  return iterate_texture_string (data, s, 0, 0, 0, 0, height_ret);
+}
+
+
+static struct texfont_cache *
+get_cache (texture_font_data *data, const char *string)
+{
+  int count = 0;
+  texfont_cache *prev = 0, *prev2 = 0, *curr = 0, *next = 0;
+
+  if (data->cache)
+    for (prev2 = 0, prev = 0, curr = data->cache, next = curr->next;
+         curr;
+         prev2 = prev, prev = curr, curr = next,
+           next = (curr ? curr->next : 0), count++)
+      {
+        if (!strcmp (string, curr->string))
+          {
+            if (prev)
+              prev->next = next;       /* Unlink from list */
+            if (curr != data->cache)
+              {
+                curr->next = data->cache;  /* Move to front */
+                data->cache = curr;
+              }
+            return curr;
+          }
+      }
+
+  /* Made it to the end of the list without a hit.
+     If the cache is full, empty out the last one on the list,
+     and move it to the front.  Keep the texid.
+   */
+  if (count > data->cache_size)
+    {
+      free (prev->string);
+      prev->string  = 0;
+      prev->width   = 0;
+      prev->height  = 0;
+      prev->width2  = 0;
+      prev->height2 = 0;
+      if (prev2)
+        prev2->next = 0;
+      if (prev != data->cache)
+        prev->next = data->cache;
+      data->cache = prev;
+      return prev;
     }
-  if (x > max_w) max_w = x;
-  if (height_ret) *height_ret = h;
-  return max_w;
+
+  /* Not cached, and cache not full.  Add a new entry at the front,
+     and allocate a new texture for it.
+   */
+  curr = (struct texfont_cache *) calloc (1, sizeof(*prev));
+  glGenTextures (1, &curr->texid);
+  curr->string = 0;
+  curr->next = data->cache;
+  data->cache = curr;
+
+  return curr;
 }
 
 
@@ -414,191 +459,358 @@ texture_string_width (texture_font_data *data, const char *c, int *height_ret)
 void
 print_texture_string (texture_font_data *data, const char *string)
 {
-  XFontStruct *f = data->font;
-  GLfloat line_height = f->ascent + f->descent;
-# ifdef DO_SUBSCRIPTS
-  GLfloat sub_shift = (line_height * 0.3);
-  Bool sub_p = False;
-# endif /* DO_SUBSCRIPTS */
-  int cw = texture_string_width (data, "m", 0);
-  int tabs = cw * 7;
-  int x, y;
-  unsigned int i;
-  GLint old_texture = 0;
-  GLfloat omatrix[16];
-  int ofront;
-
-  glGetIntegerv (GL_TEXTURE_BINDING_2D, &old_texture);
-  glGetIntegerv (GL_FRONT_FACE, &ofront);
-  glGetFloatv (GL_TEXTURE_MATRIX, omatrix);
-
-  clear_gl_error ();
+  int line_height = data->xftfont->ascent + data->xftfont->descent;
+  int margin = line_height * 0.35;
+  int width, height;
+  int width2, height2;
+  XWindowAttributes xgwa;
+  Pixmap p = 0;
+  texfont_cache *cache;
 
-  glPushMatrix();
+  if (!*string) return;
 
-  glNormal3f (0, 0, 1);
-  glFrontFace (GL_CW);
+  cache = get_cache (data, string);
 
-  glMatrixMode (GL_TEXTURE);
-  glLoadIdentity ();
-  glMatrixMode (GL_MODELVIEW);
+  /* Measure the string and make a pixmap that will fit it,
+     unless it's cached.
+   */
+  if (cache->string)
+    {
+      width   = data->cache->width;
+      height  = data->cache->height;
+    }
+  else
+    {
+      Window window = RootWindow (data->dpy, 0);
+      XGCValues gcv;
+      GC gc;
 
-  x = 0;
-  y = 0;
-  for (i = 0; i < strlen(string); i++)
+      XGetWindowAttributes (data->dpy, window, &xgwa);
+      width = iterate_texture_string (data, string, 0, 0, 0, 0, &height);
+      p = XCreatePixmap (data->dpy, window, 
+                         width  + margin*2,
+                         height + margin*2,
+                         xgwa.depth);
+      gcv.foreground = BlackPixelOfScreen (xgwa.screen);
+      gc = XCreateGC (data->dpy, p, GCForeground, &gcv);
+      XFillRectangle (data->dpy, p, gc, 0, 0, 
+                      width  + margin*2,
+                      height + margin*2);
+      XFreeGC (data->dpy, gc);
+    }
+
+  /* Draw the string into the pixmap, unless it's cached.
+   */
+  if (!cache->string)
     {
-      unsigned char c = string[i];
-      if (c == '\n')
-        {
-          y -= line_height;
-          x = 0;
-        }
-      else if (c == '\t')
+      XRenderColor rcolor;
+      XftColor xftcolor;
+      XftDraw *xftdraw;
+      rcolor.red = rcolor.green = rcolor.blue = rcolor.alpha = 0xFFFF;
+      XftColorAllocValue (data->dpy, xgwa.visual, xgwa.colormap,
+                          &rcolor, &xftcolor);
+      xftdraw = XftDrawCreate (data->dpy, p, xgwa.visual, xgwa.colormap);
+      iterate_texture_string (data, string, xftdraw, &xftcolor,
+                              margin, 0, 0);
+      XftDrawDestroy (xftdraw);
+      XftColorFree (data->dpy, xgwa.visual, xgwa.colormap, &xftcolor);
+    }
+
+  {
+    GLint old_texture;
+    int ofront, oblend;
+    Bool alpha_p, blend_p;
+    GLfloat omatrix[16];
+    GLfloat qx0, qy0, qx1, qy1;
+    GLfloat tx0, ty0, tx1, ty1;
+
+    /* Save the prevailing texture environment, and set up ours.
+     */
+    glGetIntegerv (GL_TEXTURE_BINDING_2D, &old_texture);
+    glGetIntegerv (GL_FRONT_FACE, &ofront);
+    glGetIntegerv (GL_BLEND_DST, &oblend);
+    glGetFloatv (GL_TEXTURE_MATRIX, omatrix);
+    blend_p = glIsEnabled (GL_BLEND);
+    alpha_p = glIsEnabled (GL_ALPHA_TEST);
+
+    clear_gl_error ();
+
+    glPushMatrix();
+
+    glNormal3f (0, 0, 1);
+    glFrontFace (GL_CW);
+
+    glMatrixMode (GL_TEXTURE);
+    glLoadIdentity ();
+    glMatrixMode (GL_MODELVIEW);
+
+    glBindTexture (GL_TEXTURE_2D, cache->texid);
+    check_gl_error ("texture font binding");
+
+    glEnable(GL_TEXTURE_2D);
+
+    /* Copy the bits from the Pixmap into a texture, unless it's cached.
+     */
+    if (cache->string)
+      {
+        width2  = data->cache->width2;
+        height2 = data->cache->height2;
+        if (p) abort();
+      }
+    else
+      {
+        width2  = width  + margin*2;
+        height2 = height + margin*2;
+        bitmap_to_texture (data->dpy, p, xgwa.visual, xgwa.depth,
+                           &width2, &height2);
+        XFreePixmap (data->dpy, p);
+      }
+
+
+    /* Texture-rendering parameters to make font pixmaps tolerable to look at.
+     */
+
+    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+                     GL_LINEAR_MIPMAP_LINEAR);
+
+    /* LOD bias is part of OpenGL 1.4.
+       GL_EXT_texture_lod_bias has been present since the original iPhone.
+     */
+# if !defined(GL_TEXTURE_LOD_BIAS) && defined(GL_TEXTURE_LOD_BIAS_EXT)
+#   define GL_TEXTURE_LOD_BIAS GL_TEXTURE_LOD_BIAS_EXT
+# endif
+# ifdef GL_TEXTURE_LOD_BIAS
+    glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, 0.25);
+# endif
+    clear_gl_error();  /* invalid enum on iPad 3 */
+
+    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+    /* Don't write the transparent parts of the quad into the depth buffer. */
+    glAlphaFunc (GL_GREATER, 0.01);
+    glEnable (GL_ALPHA_TEST);
+    glEnable (GL_BLEND);
+    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+    /* Draw a quad with that texture on it, possibly using a cached texture.
+     */
+    qx0 = -margin;
+    qy0 = line_height + margin;
+    qx1 = width + margin;
+    qy1 = line_height - height - margin;
+
+    tx0 = 0;
+    ty0 = 0;
+    tx1 = (width  + margin*2) / (GLfloat) width2;
+    ty1 = (height + margin*2) / (GLfloat) height2;
+
+    glBegin (GL_QUADS);
+    glTexCoord2f (tx0, ty0); glVertex3f (qx0, qy0, 0);
+    glTexCoord2f (tx1, ty0); glVertex3f (qx1, qy0, 0);
+    glTexCoord2f (tx1, ty1); glVertex3f (qx1, qy1, 0);
+    glTexCoord2f (tx0, ty1); glVertex3f (qx0, qy1, 0);
+    glEnd();
+
+    glPopMatrix();
+
+    /* Reset to the caller's texture environment.
+     */
+    glBindTexture (GL_TEXTURE_2D, old_texture);
+    glFrontFace (ofront);
+    if (!alpha_p) glDisable (GL_ALPHA_TEST);
+    if (!blend_p) glDisable (GL_BLEND);
+    glBlendFunc (GL_SRC_ALPHA, oblend);
+  
+    glMatrixMode (GL_TEXTURE);
+    glMultMatrixf (omatrix);
+    glMatrixMode (GL_MODELVIEW);
+
+    check_gl_error ("texture font print");
+
+    /* Store this string into the cache, unless that's where it came from.
+     */
+    if (!cache->string)
+      {
+        cache->string  = strdup (string);
+        cache->width   = width;
+        cache->height  = height;
+        cache->width2  = width2;
+        cache->height2 = height2;
+      }
+  }
+}
+
+
+/* Draws the string on the window at the given pixel position.
+   Newlines and tab stops are honored.
+   Any numbers inside [] will be rendered as a subscript.
+   Assumes the font has been loaded as with load_texture_font().
+
+   Position is 0 for center, 1 for top left, 2 for bottom left.
+ */
+void
+print_texture_label (Display *dpy,
+                     texture_font_data *data,
+                     int window_width, int window_height,
+                     int position,
+                     const char *string)
+{
+  GLfloat color[4];
+
+  Bool tex_p   = glIsEnabled (GL_TEXTURE_2D);
+  Bool texs_p  = glIsEnabled (GL_TEXTURE_GEN_S);
+  Bool text_p  = glIsEnabled (GL_TEXTURE_GEN_T);
+  Bool light_p = glIsEnabled (GL_LIGHTING);
+  Bool depth_p = glIsEnabled (GL_DEPTH_TEST);
+  Bool cull_p  = glIsEnabled (GL_CULL_FACE);
+  Bool fog_p   = glIsEnabled (GL_FOG);
+  GLint ovp[4];
+
+#  ifndef HAVE_JWZGLES
+  GLint opoly[2];
+  glGetIntegerv (GL_POLYGON_MODE, opoly);
+#  endif
+
+  glGetIntegerv (GL_VIEWPORT, ovp);
+
+  glGetFloatv (GL_CURRENT_COLOR, color);
+
+  glEnable (GL_TEXTURE_2D);
+  glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+  glPolygonMode (GL_FRONT, GL_FILL);
+
+  glDisable (GL_TEXTURE_GEN_S);
+  glDisable (GL_TEXTURE_GEN_T);
+  glDisable (GL_LIGHTING);
+  glDisable (GL_CULL_FACE);
+  glDisable (GL_FOG);
+
+  glDisable (GL_DEPTH_TEST);
+
+  /* Each matrix mode has its own stack, so we need to push/pop
+     them separately.
+   */
+  glMatrixMode(GL_PROJECTION);
+  glPushMatrix();
+  {
+    glLoadIdentity();
+
+    glMatrixMode(GL_MODELVIEW);
+    glPushMatrix();
+    {
+      int x, y, w, h, lh, swap;
+      int rot = (int) current_device_rotation();
+
+      glLoadIdentity();
+      glViewport (0, 0, window_width, window_height);
+      glOrtho (0, window_width, 0, window_height, -1, 1);
+
+      while (rot <= -180) rot += 360;
+      while (rot >   180) rot -= 360;
+
+      lh = texture_string_width (data, "M", 0);
+      w = texture_string_width (data, string, &h);
+
+      if (rot > 135 || rot < -135)             /* 180 */
         {
-          if (tabs)
-            x = ((x + tabs) / tabs) * tabs;  /* tab to tab stop */
+          glTranslatef (window_width, window_height, 0);
+          glRotatef (180, 0, 0, 1);
         }
-# ifdef DO_SUBSCRIPTS
-      else if (c == '[' && (isdigit (string[i+1])))
+      else if (rot > 45)                       /* 90 */
         {
-          sub_p = True;
-          y -= sub_shift;
+          glTranslatef (window_width, 0, 0);
+          glRotatef (90, 0, 0, 1);
+          swap = window_width;
+          window_width = window_height;
+          window_height = swap;
         }
-      else if (c == ']' && sub_p)
+      else if (rot < -45)                      /* 270 */
         {
-          sub_p = False;
-          y += sub_shift;
+          glTranslatef(0, window_height, 0);
+          glRotatef (-90, 0, 0, 1);
+          swap = window_width;
+          window_width = window_height;
+          window_height = swap;
         }
-# endif /* DO_SUBSCRIPTS */
-      else
-        {
-          /* For a small font, the texture is divided into 16x16 rectangles
-             whose size are the max_bounds charcell of the font.  Within each
-             rectangle, the individual characters' charcells sit in the upper
-             left.
-
-             For a larger font, the texture will itself be subdivided, to
-             keep the texture sizes small (in that case we deal with, e.g.,
-             4 grids of 8x8 characters instead of 1 grid of 16x16.)
-
-             Within each texture:
-
-               [A]----------------------------
-                |     |           |   |      |
-                |   l |         w |   | r    |
-                |   b |         i |   | b    |
-                |   e |         d |   | e    |
-                |   a |         t |   | a    |
-                |   r |         h |   | r    |
-                |   i |           |   | i    |
-                |   n |           |   | n    |
-                |   g |           |   | g    |
-                |     |           |   |      |
-                |----[B]----------|---|      |
-                |     |   ascent  |   |      |
-                |     |           |   |      |
-                |     |           |   |      |
-                |--------------------[C]     |
-                |         descent            |
-                |                            | cell_width,
-                ------------------------------ cell_height
-
-             We want to make a quad from point A to point C.
-             We want to position that quad so that point B lies at x,y.
-           */
-          int lbearing = (f->per_char && c >= f->min_char_or_byte2
-                          ? f->per_char[c - f->min_char_or_byte2].lbearing
-                          : f->min_bounds.lbearing);
-          int rbearing = (f->per_char && c >= f->min_char_or_byte2
-                          ? f->per_char[c - f->min_char_or_byte2].rbearing
-                          : f->max_bounds.rbearing);
-          int ascent   = (f->per_char && c >= f->min_char_or_byte2
-                          ? f->per_char[c - f->min_char_or_byte2].ascent
-                          : f->max_bounds.ascent);
-          int descent  = (f->per_char && c >= f->min_char_or_byte2
-                          ? f->per_char[c - f->min_char_or_byte2].descent
-                          : f->max_bounds.descent);
-          int cwidth   = (f->per_char && c >= f->min_char_or_byte2
-                          ? f->per_char[c - f->min_char_or_byte2].width
-                          : f->max_bounds.width);
-
-          unsigned char cc = c % (256 / data->ntextures);
-
-          int gs = (16 / data->grid_mag);                /* grid size */
-
-          int ax = ((int) cc % gs) * data->cell_width;    /* point A */
-          int ay = ((int) cc / gs) * data->cell_height;
-
-          int bx = ax - lbearing;                         /* point B */
-          int by = ay + ascent;
-
-          int cx = bx + rbearing + 1;                     /* point C */
-          int cy = by + descent  + 1;
-
-          GLfloat tax = (GLfloat) ax / data->tex_width;  /* tex coords of A */
-          GLfloat tay = (GLfloat) ay / data->tex_height;
-
-          GLfloat tcx = (GLfloat) cx / data->tex_width;  /* tex coords of C */
-          GLfloat tcy = (GLfloat) cy / data->tex_height;
-
-          GLfloat qx0 = x + lbearing;                   /* quad top left */
-          GLfloat qy0 = y + ascent;
-          GLfloat qx1 = qx0 + rbearing - lbearing;       /* quad bot right */
-          GLfloat qy1 = qy0 - (ascent + descent);
-
-          if (cwidth > 0 && c != ' ')
-            {
-              int which = c / (256 / data->ntextures);
-              if (which >= data->ntextures) abort();
-              glBindTexture (GL_TEXTURE_2D, data->texid[which]);
-
-              glBegin (GL_QUADS);
-              glTexCoord2f (tax, tay); glVertex3f (qx0, qy0, 0);
-              glTexCoord2f (tcx, tay); glVertex3f (qx1, qy0, 0);
-              glTexCoord2f (tcx, tcy); glVertex3f (qx1, qy1, 0);
-              glTexCoord2f (tax, tcy); glVertex3f (qx0, qy1, 0);
-              glEnd();
-#if 0
-              glDisable(GL_TEXTURE_2D);
-              glBegin (GL_LINE_LOOP);
-              glTexCoord2f (tax, tay); glVertex3f (qx0, qy0, 0);
-              glTexCoord2f (tcx, tay); glVertex3f (qx1, qy0, 0);
-              glTexCoord2f (tcx, tcy); glVertex3f (qx1, qy1, 0);
-              glTexCoord2f (tax, tcy); glVertex3f (qx0, qy1, 0);
-              glEnd();
-              glEnable(GL_TEXTURE_2D);
-#endif
-            }
 
-          x += cwidth;
-        }
+      switch (position) {
+      case 0:                                  /* center */
+        x = (window_width  - w) / 2;
+        y = (window_height - h) / 2;
+        break;
+      case 1:                                  /* top */
+        x = lh;
+        y = window_height - lh * 2;
+        break;
+      case 2:                                  /* bottom */
+        x = lh;
+        y = h - lh;
+        break;
+      default:
+        abort();
+      }
+
+      glTranslatef (x, y, 0);
+
+      /* draw the text five times, to give it a border. */
+      {
+        const XPoint offsets[] = {{ -1, -1 },
+                                  { -1,  1 },
+                                  {  1,  1 },
+                                  {  1, -1 },
+                                  {  0,  0 }};
+        int i;
+
+        glColor3f (0, 0, 0);
+        for (i = 0; i < countof(offsets); i++)
+          {
+            if (offsets[i].x == 0)
+              glColor4fv (color);
+            glPushMatrix();
+            glTranslatef (offsets[i].x, offsets[i].y, 0);
+            print_texture_string (data, string);
+            glPopMatrix();
+          }
       }
+    }
+    glPopMatrix();
+  }
+  glMatrixMode(GL_PROJECTION);
   glPopMatrix();
 
-  /* Reset to the caller's default */
-  glBindTexture (GL_TEXTURE_2D, old_texture);
-  glFrontFace (ofront);
-  
-  glMatrixMode (GL_TEXTURE);
-  glMultMatrixf (omatrix);
-  glMatrixMode (GL_MODELVIEW);
+  if (tex_p)   glEnable (GL_TEXTURE_2D); else glDisable (GL_TEXTURE_2D);
+  if (texs_p)  glEnable (GL_TEXTURE_GEN_S);/*else glDisable(GL_TEXTURE_GEN_S);*/
+  if (text_p)  glEnable (GL_TEXTURE_GEN_T);/*else glDisable(GL_TEXTURE_GEN_T);*/
+  if (light_p) glEnable (GL_LIGHTING); /*else glDisable (GL_LIGHTING);*/
+  if (depth_p) glEnable (GL_DEPTH_TEST); else glDisable (GL_DEPTH_TEST);
+  if (cull_p)  glEnable (GL_CULL_FACE); /*else glDisable (GL_CULL_FACE);*/
+  if (fog_p)   glEnable (GL_FOG); /*else glDisable (GL_FOG);*/
+
+  glViewport (ovp[0], ovp[1], ovp[2], ovp[3]);
+
+# ifndef HAVE_JWZGLES
+  glPolygonMode (GL_FRONT, opoly[0]);
+# endif
 
-  check_gl_error ("texture font print");
+  glMatrixMode(GL_MODELVIEW);
 }
 
+
 /* Releases the font and texture.
  */
 void
 free_texture_font (texture_font_data *data)
 {
-  int i;
-
-  for (i = 0; i < data->ntextures; i++)
-    if (data->texid[i])
-      glDeleteTextures (1, &data->texid[i]);
-
-  if (data->font)
-    XFreeFont (data->dpy, data->font);
-
+  while (data->cache)
+    {
+      texfont_cache *next = data->cache->next;
+      glDeleteTextures (1, &data->cache->texid);
+      free (data->cache);
+      data->cache = next;
+    }
+  if (data->xftfont)
+    XftFontClose (data->dpy, data->xftfont);
   free (data);
 }
index 13f8cef2759c003306430de5cec6b7248c1457a8..a708ae2be6ad344f98faa61cefe2d197258a19d4 100644 (file)
@@ -32,6 +32,17 @@ extern int texture_string_width (texture_font_data *, const char *,
  */
 extern void print_texture_string (texture_font_data *, const char *);
 
+/* Draws the string on the window at the given pixel position.
+   Newlines and tab stops are honored.
+   Any numbers inside [] will be rendered as a subscript.
+   Assumes the font has been loaded as with load_texture_font().
+
+   Position is 0 for center, 1 for top left, 2 for bottom left.
+ */
+void print_texture_label (Display *, texture_font_data *,
+                          int window_width, int window_height,
+                          int position, const char *string);
+
 /* Releases the texture font.
  */
 extern void free_texture_font (texture_font_data *);
index b0ee542e0a672373f60252217cc4b954dfed3c9d..3c82428136a347681f5b1f70416c673bc776a2d4 100644 (file)
@@ -316,10 +316,11 @@ draw_histogram (ModeInfo *mi, GLfloat ratio)
         j = bp->histogram_fp + 1;
         for (i = 0; i < samples; i++)
           {
-            GLfloat x = i;
+            GLfloat x, y, z;
             if (j >= samples) j = 0;
-            GLfloat y = bp->histogram[j];
-            GLfloat z = 0;
+            x = i;
+            y = bp->histogram[j];
+            z = 0;
 
             y += (int) ((random() % 16) - 8);
             y += 16;  /* margin at bottom of screen */
index b0e29e687d600dd16eab1b6a5b5da699715ccbf0..a5c0c96e0f6b4be593a9c2e0e260d2f2fbb803a2 100644 (file)
 
 #include <stdlib.h>
 
-#ifndef HAVE_COCOA
+#ifdef HAVE_COCOA
+#elif defined(HAVE_ANDROID)
+# include <GLES/gl.h>
+#else
 # include <GL/gl.h>
 #endif
 
index 842a074425fd455b59b65fd6e982d8c7bc6ec324..86f7ce69f5d6e45764e2871c7623b8f96d4d5807 100644 (file)
@@ -34,7 +34,7 @@
  *    http://www.guitar-list.com/download-software/convert-sketchup-skp-files-dxf-or-stl
  */
 
-#define LABEL_FONT "-*-helvetica-bold-r-normal-*-240-*"
+#define LABEL_FONT "-*-helvetica-bold-r-normal-*-*-240-*-*-*-*-*-*"
 
 #define DEFAULTS       "*delay:        20000       \n" \
                        "*count:        25          \n" \
@@ -60,7 +60,7 @@
                        "*program:      xscreensaver-text\n" \
                        "*usePty:       False\n"
 
-#define DEBUG
+#undef DEBUG
 #define WORDBUBBLES
 
 # define refresh_robot 0
@@ -82,7 +82,7 @@
 
 #ifdef WORDBUBBLES
 # include "textclient.h"
-# include "glxfonts.h"
+# include "texfont.h"
 #endif
 
 #include <ctype.h>
@@ -1605,8 +1605,10 @@ init_walker (ModeInfo *mi, walker *f)
 /* Draw a robot standing in the right place, 1 unit tall.
  */
 static int
-draw_walker (ModeInfo *mi, walker *f)
+draw_walker (ModeInfo *mi, walker *f, const char *tag)
 {
+  robot_configuration *bp = &bps[MI_SCREEN(mi)];
+  int wire = MI_IS_WIREFRAME(mi);
   int count = 0;
   glPushMatrix();
 
@@ -1637,14 +1639,35 @@ draw_walker (ModeInfo *mi, walker *f)
   /* Draw these last, and outer shell first, to make transparency work.
      The order in which things hit the depth buffer matters.
    */
- if (f->body_transparency >= 0.001)
-   {
-     count += draw_arm (mi, f, True,  f->hand_rot[0], f->hand_pos[0]);
-     count += draw_arm (mi, f, False, f->hand_rot[1], f->hand_pos[1]);
-     count += draw_body (mi, f, False);
-     count += draw_body (mi, f, True);
-     count += draw_dome (mi, f);
-   }
+  if (f->body_transparency >= 0.001)
+    {
+      count += draw_arm (mi, f, True,  f->hand_rot[0], f->hand_pos[0]);
+      count += draw_arm (mi, f, False, f->hand_rot[1], f->hand_pos[1]);
+      count += draw_body (mi, f, False);
+      count += draw_body (mi, f, True);
+      count += draw_dome (mi, f);
+    }
+
+  if (tag)  /* For debugging depth sorting: label each robot */
+    {
+      GLfloat m[4][4];
+      if (! wire) glDisable (GL_DEPTH_TEST);
+      glColor3f (1, 1, 1);
+      glPushMatrix();
+
+      /* Billboard rotation */
+      glGetFloatv (GL_MODELVIEW_MATRIX, &m[0][0]);
+      m[0][0] = 1; m[1][0] = 0; m[2][0] = 0;
+      m[0][1] = 0; m[1][1] = 1; m[2][1] = 0;
+      m[0][2] = 0; m[1][2] = 0; m[2][2] = 1;
+      glLoadIdentity();
+      glMultMatrixf (&m[0][0]);
+      glScalef (0.04, 0.04, 0.04);
+
+      print_texture_string (bp->font_data, tag);
+      glPopMatrix();
+      if (! wire) glEnable (GL_DEPTH_TEST);
+    }
 
   glPopMatrix();
   return count;
@@ -2112,7 +2135,7 @@ draw_label (ModeInfo *mi, walker *f, GLfloat y_off, GLfloat scale,
     glTranslatef (-w/2, h*2/3 + (cw * 7), 0);
 
     glPushMatrix();
-    glTranslatef (0, -h - ch/4, -0.1);
+    glTranslatef (0, -h + (ch * 1.2), -0.1);
     draw_bubble_box (mi, w, h, 
                      ch * 2,           /* corner radius */
                      ch * 2.5,         /* arrow height */
@@ -2121,9 +2144,7 @@ draw_label (ModeInfo *mi, walker *f, GLfloat y_off, GLfloat scale,
     glPopMatrix();
 
     glColor4fv (bp->text_color);
-    print_gl_string (mi->dpy, bp->font_data,
-                     0, 0, 0, 0,
-                     label, False);
+    print_texture_string (bp->font_data, label);
   }
 
   glPopMatrix();
@@ -2229,6 +2250,20 @@ bubble (ModeInfo *mi)
 
 
 
+typedef struct {
+  int i;
+  GLdouble d;
+} depth_sorter;
+
+static int
+cmp_depth_sorter (const void *aa, const void *bb)
+{
+  const depth_sorter *a = (depth_sorter *) aa;
+  const depth_sorter *b = (depth_sorter *) bb;
+  return (a->d == b->d ? 0 : a->d < b->d ? -1 : 1);
+}
+
+
 ENTRYPOINT void
 draw_robot (ModeInfo *mi)
 {
@@ -2236,6 +2271,7 @@ draw_robot (ModeInfo *mi)
   Display *dpy = MI_DISPLAY(mi);
   Window window = MI_WINDOW(mi);
   GLfloat robot_size;
+  depth_sorter *sorted;
   int i;
 
   if (!bp->glx_context)
@@ -2336,32 +2372,64 @@ draw_robot (ModeInfo *mi)
 
 # endif /* DEBUG */
 
+  /* For transparency to work right, we have to draw the robots from
+     back to front, from the perspective of the observer.  So project
+     the origin of the robot to screen coordinates, and sort that by Z.
+   */
+  sorted = (depth_sorter *) calloc (bp->nwalkers, sizeof (*sorted));
+  {
+    GLdouble m[16], p[16];
+    GLint v[4];
+    glGetDoublev (GL_MODELVIEW_MATRIX, m);
+    glGetDoublev (GL_PROJECTION_MATRIX, p);
+    glGetIntegerv (GL_VIEWPORT, v);
+
+    for (i = 0; i < bp->nwalkers; i++)
+      {
+        GLdouble x, y, z;
+        walker *f = &bp->walkers[i];
+        gluProject (f->y, f->z, f->x, m, p, v, &x, &y, &z);
+        sorted[i].i = i;
+        sorted[i].d = -z;
+      }
+    qsort (sorted, i, sizeof(*sorted), cmp_depth_sorter);
+  }
+
+
   mi->polygon_count = 0;
   for (i = 0; i < bp->nwalkers; i++)
     {
-      walker *f = &bp->walkers[i];
-      int i, ticks = 22 * speed * f->speed;
+      int ii = sorted[i].i;
+      walker *f = &bp->walkers[ii];
+      int ticks = 22 * speed * f->speed;
       int max = 180;
+      char tag[1024];
+      *tag = 0;
 
       if (ticks < 1) ticks = 1;
       if (ticks > max) ticks = max;
 
-      mi->polygon_count += draw_walker (mi, f);
-
 # ifdef DEBUG
       if (debug_p)
+        sprintf (tag, "%.4f, %.4f,  %.4f",
+                 bp->debug_x, bp->debug_y, bp->debug_z);
+      else
         {
-          char s[1024];
-          sprintf (s, "%.4f, %.4f,  %.4f",
-                   bp->debug_x, bp->debug_y, bp->debug_z);
-          glColor3f (1, 1, 1);
-          draw_label (mi, f, -0.3, 1, s);
+#  if 1
+          /* sprintf (tag + strlen(tag), "    %d\n", ii); */
+          sprintf (tag + strlen(tag), "    %d\n", bp->nwalkers - i - 1);
+          /* sprintf (tag + strlen(tag), "%.03f\n", sorted[i].d); */
+#  endif
         }
+
 # endif /* DEBUG */
 
-      for (i = 0; i < ticks; i++)
+      mi->polygon_count += draw_walker (mi, f, tag);
+
+      for (ii = 0; ii < ticks; ii++)
         tick_walker (mi, f);
     }
+  free (sorted);
 
 
   glPopMatrix ();
index 85aa7de0f41631979e4bdac599cc11f61cce89f8..f2e01b669b6c19dc536d256cd745995841a0c369 100644 (file)
@@ -16,7 +16,7 @@
 
 #include <stdio.h>
 #include "xlockmoreI.h"
-#include "glxfonts.h"
+#include "texfont.h"
 
 #ifndef isupper
 # define isupper(c)  ((c) >= 'A' && (c) <= 'Z')
index 851c89fc3f87fa86e6fca2d1915143f60f44c730..76690cc46c905a0dc322b14d0108c5e5c58222d4 100644 (file)
 /* XPM */
 static char *earth_xpm[] = {
-/* width height ncolors chars_per_pixel */
-"512 256 40 1",
-/* colors */
-"  c #243C6C",
-". c #22386A",
-"X c #2A365E",
-"o c #28485F",
-"O c #5D544A",
-"+ c #FEFFFF",
-"@ c #9B6852",
-"# c #2B446B",
-"$ c #24447B",
-"% c #D0ECF2",
-"& c #BE8F63",
-"* c #3E5C5F",
-"= c #FBF7DD",
-"- c #1C3C79",
-"; c #786A63",
-": c #244B8E",
-"> c #244484",
-", c #795C50",
-"< c #2B4384",
-"1 c #304D78",
-"2 c #5D5B58",
-"3 c #FCFCF4",
-"4 c #1B3363",
-"5 c #8DD9F0",
-"6 c #233C7B",
-"7 c #74BADE",
-"8 c #D0C89D",
-"9 c #5F6859",
-"0 c #827B78",
-"q c #233C6D",
-"w c #2C3C65",
-"e c #28448C",
-"r c #2C447C",
-"t c #2C3C7C",
-"y c #FFFFFF",
-"u c #1C346C",
-"i c #243466",
-"p c #334971",
-"a c #2C3C74",
-"s c None",
+/* columns rows colors chars-per-pixel */
+"1024 512 92 1 ",
+"  c #151C08",
+". c #09161A",
+"X c #0B1315",
+"o c #1B240B",
+"O c #1A2709",
+"+ c #1A2616",
+"@ c #192C11",
+"# c #222A0C",
+"$ c #25330D",
+"% c #252B14",
+"& c #2A3516",
+"* c #34391B",
+"= c #323114",
+"- c #061425",
+"; c #0A1525",
+": c #07162D",
+"> c #09152D",
+", c #0A192D",
+"< c #081927",
+"1 c #131B27",
+"2 c #0B1631",
+"3 c #0C1931",
+"4 c #071534",
+"5 c #0A132D",
+"6 c #192527",
+"7 c #162634",
+"8 c #383B24",
+"9 c #2A332D",
+"0 c #231D12",
+"q c #443D28",
+"w c #433B1B",
+"e c #37431B",
+"r c #2F4213",
+"t c #3B4425",
+"y c #394535",
+"u c #464629",
+"i c #494835",
+"p c #585638",
+"a c #514F31",
+"s c #67553A",
+"d c #585C31",
+"f c #283345",
+"g c #39464D",
+"h c #50544F",
+"j c #6A5B45",
+"k c #716A4D",
+"l c #5B656A",
+"z c #787A78",
+"x c #6A7070",
+"c c #555D5D",
+"v c #453B43",
+"b c #887456",
+"n c #867D6D",
+"m c #8D654E",
+"M c #82623C",
+"N c #7D817A",
+"B c #84837B",
+"V c #96896C",
+"C c #AA9575",
+"Z c #A79970",
+"A c #C4A67B",
+"S c #747C83",
+"D c #5E6D83",
+"F c #7B8386",
+"G c #658B93",
+"H c #888986",
+"J c #95948C",
+"K c #999A95",
+"L c #8C908F",
+"P c #A69D8E",
+"I c #A6A59B",
+"U c #B7A98B",
+"Y c #A9A9A5",
+"T c #B6B4A9",
+"R c #B8B9B8",
+"E c #AFAFAA",
+"W c #9BA1A2",
+"Q c #C8B48E",
+"! c #C3BCB1",
+"~ c #CFC699",
+"^ c #CDCAAF",
+"/ c #E3D5AB",
+"( c #B9BCC2",
+") c #CCCCCC",
+"_ c #C5C6C5",
+"` c #D3D3D4",
+"' c #DADADA",
+"] c #D8D8D6",
+"[ c #D0D1CF",
+"{ c #E0E2E0",
+"} c #BCC2C0",
+"| c #837B85",
 /* pixels */
-"55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555",
-"555555555555555%5555555555555555555555555555555555555555555555555555555555557555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555",
-"5555555%%5%%%%%%%%%%%%%%%%5%%%55555555555555%55%%%5%%%555555555555555555555555555%%%5555%%55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555",
-"555555%%%%%%%%%%%555555%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%555%%55555555555555555555555%%55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555",
-"555555%%5555555555557555555%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%555555555555555%%%%555555555555%5%555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555575555555555555555555555555555555555555555555555555555555555555555555555555",
-"55555555555555555555%%%5%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555755555555755575555755555555",
-"55555555577555555555555%%%%%%%%%%%%%%%%%%%%3%%%%%%%%%%%%%%%5%%%%3%%%%%%555555555555555555555555555555555555555555555555555%555%5555555555555555555555555555557557775555755555555555555555555555555555555777777555557577557577775555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555557555555555555555555555555555555555555555555555555555555555755555555555555555555555",
-"5555555555555555%%%%%5%55%3%%3%3%%%%%%%%%333%%%%%%5555%%%555%%%%%%%%%3333333%%%%%5555555%555%%555555555555555555555555555555555%55%55555555555555557777777777:77777777777755757777777777777777777777777777::7777777777777:::::77777777775575555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555557777777777555755555555555555555555555555555555555555555555555555555555555555555555555555",
-"55555555555555555%%%%%%3%%%%3%%3%3%%%%%%%333333%%%%%%%%%%%5%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5555555555555555555555555%%%%5%%%%55555555555555777::>>>>>$:$$$6q$6r<>>::::77777777777777777777:7::>$rrrrqq$q$q-$$$>>6$>>$r<::::::::::7777577757555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555777777755555555555555555555575555575777777777775557555555555555555555555555555555555555555555555755555555555555555555555555",
-"5555555555555555555555%%3%333%%3333%%%%%%%3%%%%%%33333%%%%%%%%%%%%%%%%%%%%%%%%%%%55555555555555555555555555%5%5%%%5555%%%55555%%5555577777::::::$u-rr<<<$$q$6qq-qq-q666qqq--<:<::>:::::$$>::::$$<<:rr11:1$r$:::::1::::::<<rrr<::::<:><:::::::777777777775555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555557777777755555555555%5555555775555555557777777777575555555555555555555555555555555555555555555555555555555555555555555555555",
-"55555555555555555555555%%%%%3%%333%%%%%%55%%%%%%%%3%33%%%%33%%%%%%%%%%%%%%%%%%%%%%555555555555555%%%%%5555%5555555555555555555577::11qrr6u.11107700775555577777:0::::::<r>>$quuuqqq qu.qrqurq1:::::<::11::75577777777:7::::::<rqrrrrrrr6rrqqq::::::::::7775555555555555777777777::::::::777777:7::777755555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555777755555555577777755775757575555555555555555555555555555555555555555755555555555555555555555555555",
-"555555555555555555555555555555555%%%55%%5555%%55%5%%%%%%%%%%333%%%%%5%%%%%%%%5%%5555555555555555555555555555555555555555777777111:11:00070077075555555%555%55%5777777::1$>-6::77777::7:$q:77777::7755%55%%%%%%%%%55557777::::::1:rtrttrt$rrrraqq$<<<::777777755555777::11r1<r$<><$<rrrr$$$r>$rr$$$6:<<::::::1::::::7:7777777::::::::::::1:::1::771::::7777777777777777777777777777777777555555577577777757577777777755577555777775555557777757775555555555555555555555555555555%555555555555555555555555555555555555555555555555",
-"5555555555555555555555555555555%%%%%%%5%%%%%5%%%%%55%%%%%%55%%%55555555555555555555555555555555555555555555577::::::1:1<$r1r1q 1775555555555%7755775555555557777011r--$$<7557555%%%55%%577%%%%%%%%%%%%%%%%%%%3%55%%%%%%57777:7777::::::::<rr$ararrrrr<<rrtr::::1:1<r$<<<<<<<<<<<<<<<<<<<<<<<<<<<<<rr1rrtr<<r<rr<rrr$r$$rrrr$r<<<r<<<<<$<<r<1<<<<<::1rr::<<:::<<r<::::::::::::::<e:eee<:::::::::::::e>::77:1<e:::::::::7755557755555555555555555555555555555%%%55555555555555555%55555555555555555555%%%5555555555555555555555555",
-"5555555555555555555555555555%%%%%%%%%%%%%%%%%%%%%%%%%55555555555555555555555555555%%%5555555555555555777:::>666$q---66q100000011p*001007700777000075555555557711$1075575%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%33%%3%%%%%557777777777:1<rrr$aqrtrr<r<<r<rr1r1rr<<<<1<<<<<<<<<<<<<<<<<r$<1<<1rr1rrrr1<1<1<<<<<<<<<<<<<<<<<<<<<<<1:::::7:1<1<11:::::1:7711:1:<<<<::::::<<<r<<<<<<<<<<<<<<<<r<r<<<<r1775577<ar<<rrrr<:7755555555%%%%%%%%%%%%%%%%%%%%%%%%555555%%%%5555555575555555555555555555555555555%%555555555555555555555555",
-"555555555555555555555555555%%%5%%%%%%%%%%%%%%%%%55555555555555555555555555555555555555555555577777::1>6q6666$6$6$r1<$$$p000757770101ip1;0w22000075%%%%%%57011$---<175%33%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3%%%%%%%33%33%55577777:1q6rrrrrrar$rr1<r1<r<<<<<<<1<<<<<<<<<<<<<<1<<11r:11p0007007777011r<<1r<111<<<<<<<<<r<<<<<<<<<:::11<<<1<<1<:1:1:111<<<<<<<<<<r<<1r<1<<<<<<<<<<<<<<<<<<<<<1<<<101177000::1rrrr<rrr11755555%%%%%%%%%%%%%%%%%%%5%%55%%55555555%%%%%%%5%%555555555555555555555555555555555555555555555555555555",
-"555555555555555555555555555%%%55%%%%55%%%%555%%55555555575555555555555555555555575777:::1:::::<<$6q-$$rr$r11::<<$6rr$$qr11020075550012210000075%557755011quuu-<1:1:0%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%333%333333355777:::<rrrrrr$raqaarrr<r<r<r<1r<r1<<<<<<<<<<<<<<10700700800002001700111r<<<<<1<<<<<<<1<<<1<<<1<<<<<<rr<1<<<<<<<<<<<<<<<<<<:<:<<<<<1<<r<<<<<<<<<<<<<<<<<<<1<<<<1<<111<1<00777770w::11rrrrt11755%33%%%%%%%33%%%%%33%%%55555555777777555555555%%%%%5555555555555555%555%%%5555%%%%%%%%%%%%%%%%%%%%%%",
-"%%%%%%%%%%5%555555555%5%5555%%%5%%%%%55555555555555555555555555555555555777::::1$>$qqq--q-q-q$$rr<1<$$<><rr1111111aqp1111qr2007070112**p;00075%%575701q-607775%%%3%3%%%%%%3%%%%3%3%%3%%%%%%%%%%%%%%%%%%%%%%%%%%333%3%3333333%%5757:arrrr<rrrrrqq$a$rrrrrr<r<r<r<r<r<<<<<<1<<<1<1p00800000&&0001ra6$rr<rr1<1<<<1<r<<<<<<<<<1<<<<<<<<<<<<<<<<<<<<<<<<:<<<<:<<<<<<<1<r<<<<r<<<1<r<r<<<<<<<r<r<1<<1<<<<r<rr11<<1111:1#wwwrr<<a<7555%55555555%%557755555777777::::::::::777555555555%%%%%55555555555%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
-"%%%%%%%%5555%%55555555%%%%55%%%%%%5%%%5555555555555555555555555555555577:$$-u-q-$q$r6q6$$$rrrqr111016$$$$qa<rar1aw.qrappp waqw11. .p1110007755%%57771$>>>775555555%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3%%33333333%33333333333333+%55577:1rrrrrrrrrr$aaq6r$rrrrr<1<r<r<r<r1<<1<<<<r<<<<<<t1a p0pppt6<11rr<<r<<<<<<1<r<1<r<<1<1<<<<<<<<<1<<<<<1<<<<<<<<<:<:<:<:<<:<:<<<rr<<<<<<<<<<<1<r<r<<<<1<<1<r<1<rrrrr1rrr<rrrrtrrrar<11rr<1<rq<::75%%%55555555555575777777::::::::::::::::::77777555555555555%%5%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
-"%%%555555%5555555555%%5555%555555555555555555555%5555555555555555755557555777:$r$$q6r111111r6r$a1rr$r$6r$qwr-q6-6$q6qaap11prq6121<1000700557%5%5:<q--6$>6--1:77555%%%%%%%%%%%%%%%%%%%%3%3%3%%%333333333333333333333333333%577757:w11rrrrrrrrrr$r$tqrrrr<r<rrr<rrrr<rr<rrr<r<<1r<r<<<rrrart><<$<rrr1r1r<1<<1<1<1<1<<1<<<<<<<<<<1<<<<<<<<<<<<<<<<<<:<<<:<<<<<<rr<::11<r<<<<<<<<<1<<1<1<<1r<r<rrrrrrrrrrrrr1rrrrra$::77:1<1r$$rrq q17755555555555555555555555555555557757775575555755555575755555555%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
-"%5555555555%%%%%%555555555555555%5%%%55%%%5%%55%%5%55555555555555755555555557:$6$r11001p1111::<r$qq1::qqr>a111r1<1111 a12221;000122;20000071:7771<$$$>>6>$6<1:555555777775%%%%%%%33333%33333333333333333333333333333333333%%%%57::rrrrrrrr$rrra$qaqar$rrrrrrrrrrrrrrrrrrrrr<rr<rrrr><<rrr<r<<1<rr<<<<r<r<r<1<1<1<r<r<1<<<1<1<1<1<<1<1<<<r<1<<<<<<<<<rr<::::::77771r<<<r<<<<r<rr<r<r<r1rr1rrrrrrrrr$rr<11:111111:1000777:1111;;;1rq:7557777777::::7:7777777775555555%%5%%%3+++33%%55555555555555555555555%%%%%%%%%%%%%%%%%%%%%%%%",
-"%%5555%5555555%55555555555555555555%%%55%%%%55%%%%555555555555555555555%555:$$<>$1<1pp<1r<100000:<<<001::1q1p11101000rrr11r.p000;p1ar w11:77701rq6>>>$>>$>>$6>><<$$>---q->1:75%3%%33%3333333333333333333333333333333333333333%5771111r$rrrrrr$r$qqqqqrrrrrrrrrrrrrrrrrrrrrrr<<r$<r<<rr<1<rr<rr<rr<r1<1<r<1<<<<r<r<1<r<<<<<<<1<r<r<r<r<rr<<<1<<<1rr<:7777777:0:1<1<<<<<<r<r<<rr1r1r1<1rr1<rrrrrr<<11120000000020000;00777070000000p:77:<>$$>$>$6r<6t>e::e::7777577::0;;07007087%%==%%%%5555%%%%%%%%555555555555%%%%%%%%%%%%55%%%5",
-"55%%5%%%%555555%%5%%%%%%%5%%5%%%%%%%%5%%%3%5555%55%%5%55555755555555555577:>$$$6q-q-q-6$t<111111100111111aq1<qaa.101pqr10006w;;00;000075%5%%5%0r$>6$6>$>6$>>$>>6>>>$>>>>>66-u:7533%33333%3333333333333333333333333333333333333%57::1rrrrrrrrrrrr$qaqqr$rrrrrrrrrrrrrrrrrrrrrrrrr1$rr$rrr1r$r<1<rrrrrrrrr<<<r1<<r<r<<<r<1<1<<<<1<<1<r<11<r<<<<<r1:7777711<1<<r<<<<<<<<r<<r<1rr<rr<rrr1<rrrr11220000000;@@00@;00;0;;;;200000000000;1$rqqrrrrrtrrrrtrrrrrrr$::777777770;;00007007550000083%%%3%%%%3++33++33%%%%%%%%%%%%%%%55%%%%%%5",
-"%%%55555%5%55555555%%%%%%%%%%%%%%%%%%5%%%%555%%%%%%%555555555555555577:::$6$$$r1:11:11r<<$q6qte11<tt6q6qqqqaaq$qqqqq$$aarp11q1112#11220221101:uu--6$>6>6>6>6>$>>>$>>>>$>$$>><q-:5%33%3%33333333333333333333333333333333333333%87711rrrr$rrrrrrrr$aqqqqrrrrrr$rrrrrrrrrrrrrrr<r<$<r1<<r<r<r<rr<r<<r<r<r<rr<<<<1<<<1<r1<1<1<r1<r<1<<1<r1r1<<1<1<::777111r<<<r<<1<r<1<<rr<<<r<rrrrrrrrrtrrrrr10@00;00;;000;0;000;2*2;;;;;;;;;;0;1p21a$$$rq6$tr$rrr6$>><<$rrr:::::::7777::::7775555%%5%%5%3++++yy++yy+3%33%++++++333%%%%%%%%%%%%%%%%",
-"3+3%5555%%5555555%%55%%%%%%%%%%%%5%%%5%%%5%%%%%%55%%%5555555557:111>$$666<$$$qq10000000001:r$rqqqq6qq6$6111rq$qq<:111< q2000001ruq11121-$::::1777::-6>$>$>$>>>>$>6>>$>>>r><$r$t$:5%33%33333333333333333333333333333333333858000;11rrrrrrr$r$rr$$rtqq$6r$rrrrrrrrrr$rrrrrrrrrrrr1rr<1<rrrrrrrrrr<rr1rr1rrr<<r<<1<1<rr<1<<<<r<r<<<11<rrr<rr<1r<11701pr<<<1r<1<1<1<1<r<1<<rr<r<<rrrrr<111122;22000;@0000;;;;;;;;;;0;;0;0000;;2p0;;20pp221111q6$>>>12::::::ra::::7777777::::2;;::::::::::77757007000878%%%5%3+++++++++++++++++++++++",
-"5%%55555555555%%577777777775%%%%%%57:77:::::::::<<1::111:::::1$6$$>6r$$$$$$$6q1000000001101001<:<$r1<q11001qqa::110;11rw00;201w a2;;;1p0;0000107755:-66$$6>6>6>>6>>><$>>>$$>$$>$<175%33333333333333333333333333333333333%7711000rrrrrr$rrrrrrrrrtqqqta$rrrrrrr$rrrrrrrrrrrrrrr<$<rrrrrr<r<rr<r<1<1<r<r<r<<<<1<<<<<r<1<r<r<r<<1<1rr<r<<rr<rr:1011<<t<r<rrrr<1<r<1<r110011r11<rr<r1q10000000000000000;0;;;;;;;;0;;00;;;2;;22;;;;;,00000000022:111200;1:01::r$$:::::::::::1p212a<r6>>>-$6q-6q--qq-qq6>:::::775%%%%%%%5555%%%7075555",
-"4rr  177777777557::::$uqq.w1:17557:$---6-66>>6>>>>>$6>>>666>>6>>>>$>$>$$$$$tq100000002<10000000001:001100;1.aa11100;0;1up21.qqqq2;0;;r19;;;;01ppp05%7:$q--6$$>$>>$>$>r>$>><$<$rt>:775%33333333333333333333333333333333%%%8800121rrrrrrrr$rrrrrrrr6$qqa$t$rrr$rrrrrrrrrrrrrrrrr$rr$rrrrrrrrrrrrr<r<r$rrrrr<1<r<11<<<r<<1<<1<r<<rr<rr1rr<rr<100001tr<r<1<r<r<rr1rr$1000000r102120021p2200;;;;@;0;;0;00;0;;;;;;;;;;;,2OOO,,,,;;22,,,;0@@@@@,@@@000;,;222;1::rrrrqq$6>::>>0000000001:001::>$$r6<rrr$$r>:<$r6qa11p1r1aqii44wwX4444ii4",
-"pp.44rr$$$$$$$<r<<$$$6$$6$6-q-u1:<-6$6$>>>><><><<>>><><<><>$>>>$>$<>$$>$$6$6tt1100201u1100000000000000*0;90:qqqq.a1:1*a12;1<qqq 1;2;0222;00;;00;;;08807:11rq66r>6><>$<$<>>$>$>r$::71:053333333333333333333333333333333335000;77::6rrrrrrrrrrrrrrrrqq6q$rr$rrrrrrrrrrrrrrrrrrrrr$<r<r<rrrrrrrr<r$r$r$$r$r$$$r<1<<1<<1<1<<r<r<r<rrr<r<1rrrr:10010:1r<1r1<rrrrrrr<11000000r000p10;00000;2;;@@;;@;;;;0;00;0;0;;;;;,,,22,OO,,OOO,;,,,,;;;;;;0000@08@0;00;;,;1:$q1;2p1121p12000000000000001::<q6>>$$t$$6$66$$$$aqq-qq.qu....444ui.i4wp",
-"211u.qqq66$666666q$6r$r$6666r111*111:1<<$$>$>$>$>>$>$$$<><><>r$>r>$$$tq66$$q$qqqa1qqq$q111010000009;;9999901$rr6qqqw.q1099*91$qaw1222;0000;00002;0,08570770:::66$<$>><$<$<$<$<$>rr$:::17333333333333333333333333333333%%%%5:u:071rrrrrrrrrrr$rrrr6r$qqqt$rrrr$rrrrrrrrrrrr$r$r$rrrr$rrrr$rr$$$rr1p121pp22021<$<1<1<<<<<1<rrrrr1<1rrrr<r<rr<<11101<r<<rrr<rrrrr1;0@@@@001a000000;0000012;;;;;;;;;00;0;92;2222O,,OO22OOOOOOOO9OO2O;;,,;;20;OO,OOO088;;,;00;22;;00,;000000;;;;000000;00000;11:20000011rq$aa6qqqqq.u..444444444.4i1p",
-"44..qqq$6rrr$$$6$$t66$66<11::0002;00000011;011:11<<<1:>>66>r$$$$6$6$6111w11<qq$6qq$6qqqqa:10291:19999***99*9**::< qq$qw09****1aqqqp1112200;2200112000850000857::<$>$<$>$>><$<$>r6>7777:7533333333333333333333333333333%075755711prrrrrrrrr$rrrrrrr$aqrt$rrrrrrrrrrrrrrrrrrrrrrrrrr<rrrrrrr11pp20;00000000002$11$$$r<<<<<r1<1<r<rr<rrrrrr<rrrt<<t1rr111<<1<r$rrr10@00;;01100;;;;;00;@012;;;;;0;,,29;;92992,,OOO,,O,2OOOOOOOOOOO2O2OO;;,,,;;0;9;000;OOO0888&,,088,2,;;;;,,;;0;000;0;;00000000000000;;p$>$rr$q.q. 1wi111ar qww44444",
-"uuu.qqqqtq$tqr$6$$r666$<0000;29;;;;;;;;;;;00;999999;;111::<$6q$111111200010:11011099111$q1101************12*92:awr$10911po*****rr<qqa.100221rw11< 10;;0000;;075:1$t$>$<><$<r><$>$<:77:1p7%33333333333333333333333333333+33357:1rrrrrrrrrrrrr$rrrr$6aqqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr$r1r120@;9;000000000000000011111r$<rrr<1rrrrrrrr11:1rrrr<rrrr$r11p0000;211r120000;0p100;;;;;;;;@;00;;;,;2222;22,22O,O,,,O,OOOOOOOOOOOOOOOOO,,OO;,,;,08&888&,OO,00888=&O08=0O,,,2,,,,,,;;;;0;;;;;,;;;;;0;;00;;;01011101011111pu100000;;0011pw",
-"pwuuqq6q$6q$66rqr6q1:1000022992922;;;9;;;;;;0000000000001001::2229220;00;000000990999999***0*11*211****p*111111aq<a*99*oqr*****1*01$qq1;;;;0<qq<<qa112;;0000;901q q6$>>r><>r>>><$$66-q$17%3333333333333333333333%%3+%%%5777:6qr<rrrrrrrrrrrrrrrrrr$qaa6$rrrrrrrrrrrrrrrrrrrrrrrrrrr112;20;,O999;00;;00;000000000000001<rrr<rr<1111rr111r<<102r111110110@@@@;@002110;0000p1;;;12;;;;;;;;;,;,,,,O222;,,,,,2OO,,OOOOOOOOOOOOOOOO9OO2OOO,,,;0@@0@,,,20888888@O08@;,,,,,,O2;,,,,,,;;;22,,O22;;;0;0000;2000;0000000000111000000;000000",
-"0;0pa.qqqqqqt$q666q<1000;;22992999;;9000000000000;;20;0;2009000929009,,99999999999999*99990921 1#11#q ***9**####rr##**2#*********01q1100;;;1$6qr$q10011p00;0;0077::<<6r$r$$>$><$>>$r<110%333333333333333333333333507121wa66trrrrrrrrrrrrrrrrrrrrrr6qr6rrr$rrrrrrrrrrrrrrrrrrrrrrrrrp12;;;OO*99O9;;9;9;;;000000000000000011rrrr10011rr<:00000;0000000000000@@;;;;;,;;;000pr0@@000;,;;,,;,;;;,;;,,,,2,O,2OOOOOOOOOOOOOOOOOOOOOOOOO,2000,;;&;,,,,OO0=888888080&@,,,O,,,,,2;;,,O22222,,,O,2;;;;;;0000;00;;00000000000000000000000000",
-";;000;*qq quqqqqqq$quqp;2;22222222200099222099O22929O2299**99999999999999999*999999999999999*9***999*oo9999*****99;9999**99******9;110020000<q$q6q1021rqr0000008%%%71:-$>$r$>$>>r>r<:1205+3333333333333333333+y%01qqqt$rrrrrrrr$rrrrr$rr$rrrrrrr$r$qaqrqrrrrrrrrrrrrrrrrrrrrrrr$rr$rp;@;99*9O999;;;;;999;9;;00;000000000002arr102ar<000000000000000000000;;;,;;;;;;@@00pr;;@@;;;;;;,;;;;;;22,;,,O,,2O,,OOOO99OOOOOOOOOOOOOOO2OO,,;;@022OOOOOOO2O,;080888808&,;;;O2,,,,,,,;,O,,,,2,,,,,,;;;;;;;;;;;;;00;00000;0000000000000;00000",
-"000;000p10::<-qqqquqr1<.wp*oo*229;2922929999999*92999999999999999;9999*9999999***99111992999999*99999*o*999*****99922;99O99*******9;;1122011q6a$66qqqqr1100X;00;;08%777::6rr>r>$>$$<::008+33333333333333+%%%%%51qtrrrrrrrrrrrr$1<$$$$$$$<<$$r$r$rr6qq6rrrrrr$r$rrrrrrr$rrr$rrrr<r$10@;;9*O999;;00;;;;999;9;90;002;000000001<111000000000@;0@;@0;00;00;;0;;,;;;;,,;,;;2a20@@;;;;,;;;;2;;;,,922O99O9,OO2,9OO99OO,OOOOOOOOO9OOOOOO9OOOOOOO9OOOOOOO2OO,8888000&O@88,,OO,,;;,,,,,,,,,,O22O,,,,,;;;;;;,;;00&00;;;;00000&0;;0;;;;;;;;;;",
-";*000000;00000p..11000022222***222*2*299;9999999*9*99999999999999999*999*9*999**1*1>-1*1*9*9999*9**999999999***9**929**O99******22;00111rrqqq$6t$q6qq-10000;;0001XX0070:rr6$$>r>r<$r:75773+33333333333+3%7:711aqrrrrrrrrrrrrr11001rp12p1;001$rrr$rqq$q6rrrrrrrr$rrrrrrr$rrrrrrrr$p0;99OO929;@@@0;;;0;;,;9;;,;;000pa1<111<100000000000@@00;;0@;;0;;;;;;;;,,,;;,;;;;;;;;;;@@@;,,;99;;;;O,,O,,,92,29O99,9,99OO9O9OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO2OO8808388;0&8@O,,O,,;,;,,,,,,,O,,,,,OO,;;;;;;;,;2;0008@08888&@0;2;;0;;00;;0;;00",
-"2u**p1;000012p...wp0;0;0;;22922***9**9292*O*;9OO999*9999999;999999999*9*99******::$***9**9**9****************o*****9999***********20rp;11:$qqtq$611:1:1000*O;;00:>uw111r$$$$r>$>r>rrap017+33333333333%50111qq$rrrrrrrrrrrrrr$111;000;000070;16$rt$6qqarr$rrr$rrrrrrrrrrrrrr$rr$$p;@OOOOOO9;;;0;ar6$1;;;;9;@99;0;01rr11aa1000000;0000@0@;;;;;;;;;;;;;;;;;OO;;9;,;;;;;;;;;;;;,;;29999929,99,9,,99229O9O9O9OOOO99O9OOOOOOOOOOOOOOOO9OOOOOOOOOOOOOOOOO,,@08=8808&8;,O00,,OO2,,,O,,,,O,,,,,,2,;;;2O2;O00O,0800088@;0;;0;;;;;0;;;00;0;",
-"..4uu4ip20144uii..41p1*p*wp222**O*2**22*Oo;0080O*999999*999999999999*9999*9*********9999****99*9****oo*******o***oo***************11 1;0000:-$rqq10011*200100000007$.r$$tr><>$<r>r$r$ta11%+3333333333%7-tr$rrrrrrrrrrrrrrrrrrr<<10000755%5711rr$rqqqqr6rrr$rrrrrrrrrrrrrrr$$$$r2;@,*O9OO9;;@;02$$r20;999,;2;;;@9;011100020000;000;;;;;9;99;;9;,;;;9;;,O,,,,,,2;,;,99;;;;29;999299999O,9,,,,,O99999O2OO99O9O9OOO9O9OOOOOOOOOOOO9OO,,OOOOOOOOOOOOOO*22O;8&8%=388%888800800;;;;,,,,,,,,,,,,OO2O,,O;20&,O58=888088&0;;;000000;002pXi",
-"u4.4u.uuiw..w .i...iuuuuu.w2O2*O*90*9O;100%78%5700O2O9999*9999;9,99999999**99**9999********99999****9***o**o******oo************111 120001*211qqrr1rqqq.p20000000,01<66$>>$>r>r>r<r$<$<:7%333333333+%5:rrrrrrrrrrrrrrrrrrrrrrrrr1*99070001r$r$rr6qqqqa$t$rrrrr$rrrrrrrrrr$$r1p;0,O9O*OO9@@&@02qr1;@;;;;;;;;;;;;;;;000;0000000@;;@@;,99*9999999,,;99,999OO,9O;2,;,99,;;;,O;29,9,,OO9O999999OO99999999OO9OO99OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO*2O2;00&088888=%3%8880;;,OO,,O,,,,,,,,OO;,,080088=&80;O@00;@,,;;;0;0;0;;;;w4",
-"4.4.4....44wpp1ri...$>112992**O9O0009O998%8000&88800002OOOO99999999999*99**9***999***991****99***O******ooo****o#***o*2**9*9***rqqqqrq11 r<1rrqqr<r6qq6qq.*0000112;016rr<$<><$<r>r>rrrr::8+3333+333571rrrrrrrrrrrrrrrrrrrrrrrrrrrta1<1t6q$<rrrrr$qqqqqq6rrrrrrrrr$rrrrr$$a1;,,;,,OOO*O9;;&;pa$2;@;9;;2;;;;;;,;,9;9;0@@0000;000;;;9;9999O999O99999O9OOOO9O9999,,,,OO,;,;;9,,9999OOOOOOO999O999O99O99OOOOOOOO99OOOOOOOOOOOOOOOOOOOOOOOOOO2OOOOOOOOOOOOOOOOOOOOOOO,0888=3%80000;OOOOOO,,,O,OO,O080888888OOO,,,OOO2,O,,;88000;080&0w",
-".4.4........iiw....i$1*29OO*22O920O99O20%82O2OO09205%7002;0OOO2OO9999999*******99*9*999*999*********9O9**ooo*oo#oo**o*****9916aqq6q66qqqr11rqa1rr00111111q.r#*;00: 1rq$>>>>$><r>r>rtr$t::73+33+33+%7rqrrrrrrrrrrrrrrrrrrrrrrrrrrrrr$$6$rrrrrrr$r6qq qqrqr$rr$rrr$rrrrrra2;;,999OOOOO9;;;016$rr@@;9O92292222;@,,,9;;@;@@@;;;@;;;;;99999999999999O99,OOOOOO,999;;;;9999,,99,OO99O9O9O99O9OOO99O9O999OOOO9OOOOO9OOOOOOOOOOOO2OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO;@083y38%3%8880;;02O,;0;,8,03+==8,,OO0,XXO20;;;;;0%%8880000100#",
-"..4i4......i..ii..ir0222222O****OO99;28%;O*99;009000&08870000;O02999999999O******9***9*9999*1-#1*****O***ooo*ooo*********9*aqq6q6qq6qqqq6wqqqr1ra;;000;001quuu4iw1r$q$$<$<>>>$<r>$t$<r$r::7%yy+++3+7qrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr$rrrqq  q aaqa$t$r$rt$r$r$r;@,OO9OOOOO,OO;;@0qrrr$2@,222222;2,@;;0,99;1;@@;;;,9;@,,@999999O99999999O9999OOOO,,99O,,;;9O9O9999O9999O9O9999O9O99,O99929O9O2O9OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO,OOOOOOOOOOOOOO2OOOOOOOO28@&0&8333==++%88088;088888%%=82*wpO;00242058880888=&,O2Xi44444i",
-"4i4i.i.......i...444p22O22***2****O20700****929988000800850808709999O99*9*********9********>$1*************oo*oo**oooo***2<qqqqq$q$q$6qq6qtqqqqqq2;2;,2,;0011 ..uu.qq$>>>>r>t>$<r<<r<<<<rr6057083+516rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrraqq q  qaqqqq$r$6rrrrrr;;,OOOOO9OOO9O9;;;6$rr$;;992;;;0;0&@oX*9,,;;;;;0,,9999,999999O99OO99O99999999OO9OO9O9,9;;;229O999999999999O99999999OO99O99999OOOOO9OOOO,OO,,OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO2OOOOOOOOO;8000,O838&0=88%3==%=+3%%%3=8,Xqq661;*440%=88&;;088,OXi44.4444i4",
-"i4i4i...iwwii.iuuip1wp**2*22*2O92*992;9#*90001q.p120089008820000O99O9999**O*O*****9*9********99**O*********oo*o***o******1qq6q6qa6q6q$6$q$qr6qqqqp0;;;;2;;;00..q...$$q<6r>>>><>$>r$<>r<$<<t6tte17%:-rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr6rraaq q   aqaqaqaqqq$6rr2;,OOOO9OOO9O9,,;@;1r1r2000;0;11p2;00*22,9,9,99;9,999999O999999999OOO999999OOOO9,999999,;,999OOO9999O99929OOOOO9O9O99O999OOOOO99O9O99O,O,OOOOOOOOOOOOOOOOOOO;OOOOO2O**OOOOOOOOOOOOOOOOO200000;,0%=0@,;&88&0&8&8=8888@*.qr$$qq.4088&&*;OwXw;OX44iii4i4ii4i",
-"4....i....w...4..iwp 4wwXp299*O2O2****rq20;### .u444X4X*w*;288087*OO*O99****999**************99*****o****o*******oo***9*91q6$qq$6$qqqq6qqa6qq6$qq1;;;;;;,;;;; 4..uq01$6>>$>r><$><><>r><<$<<<rrrr11r$rrrrr$r$r$rrrrrrrrrrrrrr<rrrrrrrrrrr$rr$rrrr$6$qa    q     aqaqqq$qp,,OOO,2O,2OOO,;;;;01<r$r11******;9,,,;@,,99999,999O999OO9OOO9OOO9999999O9OOOOO9,,99999,,,O999OO999O9OOOO2OO9O99OO,,9OO9,99OO9OO9OOOO,,O,OOOOOOOOOOOOOOOOOO0&OOOOO200;OOOOOOOOOOOOOOOO28;O,,,O08=80O2O0;OOOO2X*;,,@O*q6r$t$6w*8=0X4XiX444444iiiii4i4i4i4i",
-"4.4i4.4..i..i.........u.4p2**2*o*2*901u #.44u.......4.i44iw*00;9070OOOOO2*****O9**9*9****9**9*********O***o*oo***oo*******11q6q6qq6$6$qq6$6r6qqq10;;;;;;;;;;02144#2001$6><$><><<><><>r<$<r><r$rr6q$rrrrrrrrrrrrrrrrrrrrrrrr<rrrrrrrrrrrrrr$rrrrrrraaq  a #a1  a   qqqaqr;,O99*p1;;O2;;;@;*rrrrr11;@,,,;;,,,9;9,OO9,999;0,O9OOO999OOO999999999999*9OOOOOOO999O9O,,99OOOOO9O9OOO999O992999O9O999OO9OOOO9O99OO,OOOOOOOOOOOOOOOOOOOOO,0,;;2;;088;9OOOOOOOOOOOO22088OOOOO0%=&O*#qr  rqrqa66qppp#wrrq$q$wO5=,Oi1X44i.iiii4i4i4iii4i4i4",
-"iii.i.................i.....iwiw**90*#114.........i......iu4X2;;*08000920*O**O***99*****99*999******9*******oo*o*******O**9*$qqq6qqqq6$tqtq6$6qqr10;;;;;;;;;;;;2200000:$>><r<r><r<$<<<><><rr$rr$rrrr$r$rrrrrr$rrrrrrrrrrrrrrrrr$rrrrrrrrrrrrrrrrr$rqaw1 p9;pu     q qqqa12;*r6$$1;;;09;;r$p1r<$221;@,,,*,999OOO99999O;0;,999O99999OO99999O9O9999*OOOOO9,,9*99O99;299O99OOOOO9OOOOO9OO929999999O99999999O999,OOO,,OOOOOOOOOOOOOOOO2;O;,;;;88808092;9OO9O902088080OO28880;#a$raraqar$$rr6666t6$r6r1*O038O..ii...4..4....4.4..i..ii",
-"i4i.4i4..................i..i4 000p410* .....4...i..i...ii.i442;*o;70;800000O279O***99*99*99999*9**9******9o**#*****o*****99o$$$q-q6qqqq$6$a6$6q6-p0;;;;;;;;;;;00;;0;001$t><><<r>r<r><<><<<$r$rr$r$rrrr>rrrrrrrrrrrrrrrrrrrrrrrr$rrrrrrrrrrrrrrrrrrrqr1*99***p.    q  q$qtq61191a;@2;900qp01r$p;;r1@,,9O9,OOO99999O999,,,9OO999O999OO9999O9OO999O*OOOO,;,9999992999999999999O9O9OO99O9999O9OOOOOO22O9OOOOOOO,OO,,OOOOOOOO2OOOO2O9;00;O880080888@200,0888&0080808;98%=0*waarqrqtrr$tr6$rrrr$rr6$OOO7+8022i4i.i....4i4.4..4..4i.4i",
-"...4i.....................44r1002w4.1*..uiu........i.......4ii4****;*OO;0080*O90009O****99,99*99*9***o*9*****oo**oo*o**o*****999*11qqa66qqa6$qwrq$q2;2;;222;;;p;;;;;,;0;:6>>r>r<><$<<$<r<<$rrrr$r<rrr$rrrr$r$rr>rrrrrrrrrrrr>rrrrrrrrrrr$rrr$rrrr$rrara2;9O9*..         q$q10;;p-p;9;;0;r11$rr0@,;;,;,,9999OO9*O999O9999OO9O9;9O99OO9OO9999O999O999OOO;,9,,99999,9,,9999,9OOOO9O9OOOOO,99OOOOOOOOO99OOOOOOOOOOOOOOOOOOOOO2O9OO,,;;08088&888008808808&00;058000O,838&;wq6$r$r$tqr$t$6r$t$6$q$6a2OO53&&OO1w......4..4..4i4i.4..4..",
-".4.i4.4........i........ir1100144u ..u....4.u.......iii.iu....i4w*2**9O2;0280;2**O**99***999999**99**oo*9****o*ooo****o******9999;911$qqqqq$qq11qq1;;222,222;;220;;;2;;;1<>$<r<>r><<$<<<<$r$rr$rr$r$rrr$r$rrr<$rrrr$rrrrrrr<rrrrrrrrrrrrrrrrrrr$rrrr$6a12999o.          q q*999pp*;@;1;1r$<r$1@,@,,,,9,O9O9999OOOOO999999O9O999999999O99999999,99O9OO,,,9,,,,,9;;,,;;,,,,;O,OOOOOO,9O,,99O,OOOOOOOOOOOOOO,,OOOOOO2OOOOOOOOO0OOO,,,0;;880088&,28%%888008888=8&0O0=80ou$r$rqr6r$r$t$r$rqrqr6rq62OO5=@;0Oppw..4.i..i..4.i4i4.i4.4i4",
-"i4.4.i..........i..... q1110w44.................4.....i..4.i4...4499o**9;02O00;;*OO*999**9***9O**999*********o******o#******o**922*;;;1111rqqq qr1;;;22,;OO2,,;;;;2;2;;;;21e66$<>r$>r<$$><>rr$rr$rrrrr$r$rrrr$<<rrrrrrrrrrrrrrrrrrrrrrrrrr$rrr$rrr>r1111p9O99*.q           #29;*0;p;pr6$$rr$r19,,,,,9,,O9999OOO9OOO9999O99O999O9999O9999,9,99,9*OO9O9O99,@,@@@@;,,;@@@,,;;,,;,999,;,,,,,,,9OOOOOOO29OO,OOO,OOO,O2OO2OOOOO282;;OOOO;00;088800888=8808=88==8=80888;*w1rt$qrr$rtr6rr6rt$$$r$r$$r2O0=@O;,,w4.... ..4....4..4.4..4.4.",
-"4i4.4i..ii...i...i4..w11w.ii............4..4.......i..i4..u.i.4..i.wiX**O*OOOO*99229OOO99*O****OO**************oo***ooo**oooo**O**;;122;;;;a q 12;;,2222OOO*o2,,9p;;;;;;,20011r6$666$t$r$$$r$r$r<$r$rrrrr<$rrrrr$rrrrrrrrrrrrrrrrrrrrrrrrrr$rrrrrrrr*9991**O9;*w           u222*21p161r*2;21;,,9,OO9OO9OO,99OOOO9O9999999999,9O9,,99,9;@9,@@;,,9999O,,,9,,@@@@@@@@@@@@,@@,;;,;;;,,,@@;@@,@,,OOOOO2;,9;00O0O;0OOO,OOOOOOOO001090O;,O002888800888&@0;,@;;,,0&80O,,Oop*1$r6$qrr$a$t$r$$rt$t$t$r6*O8&,OO22p4..i. . ....4..4.4..4.4..",
-".4..ii..i.i.......1ai.ii..........................u......ui......4r1#4***9OO*O*29O200;09O29O9*O***29*********o#*oo*o#****oo******9;22;;2;;; ...20;2OOOOOO*****2OO****22;2;2*20p$66qrr$r$r$t$rrrr$rrrrr$r$rrrr<r$rr$rrrrrrrrrrrrrrrrrrrrrrr$rrr$rrr299;;*$r-*9@;2       .  ap*9922200*29OOOO,,,,9,,,,9O9OO,99,999O9O999O9O9O9999O,,,,,;;,@@@@@,,,;;,,,,,,@@@@@@@@@@&&@@,@@@@@@@,@@,@,@@@@@@@,O9OOOOO;2O080000OOO,,OOOOOOO001*,0;O,,;;0008808888&,88=8,,,922O,OO,O9922p22prq116$r$r$trr$r$$$$$6p0802O2u.i.....ii..4.4.4.44..4..44.",
-"..4i4.ii4.....i.wp1i......................4...........i...u.4...4uX;14w*9***2**O2*O22800002OO**99999*****o******o#o#uo***********O**22;;;;911iu*;2**Oo**********O****9*999*22;;0:q6r6r6r6r$r$rr$r$rr$<rrr<$<<$rrr$rrrrrrrrrrrrrrrrrrrrrrr$rrrrrrrrp*;@@p6r**99,;*q    qp;2999OOOOOO,99OOOOO9O,,9;,,,,OOOO99,,,,999O99,9999999999999,@@;@@@@&@,,,;,9,@@@@@@@&&&&&&&&&&&@@;@@,@@@@@;@;@@@@@@@,,OOO,;20&08&&8880,0;OOOOOOO0011000O;;080008=880@00&800&8;OOOOO9OOO9OO22O;,OO**92t$t$t$r$r6r$$$$$$#0000*14.......4.u..4..4...4.u4.4..",
-"4......iwi..w ...i..............................u.....u..........i4ip#44*99OOO**O2OOO;208809*9O9999**************oo*qq*********O2*O*O*2;;;;2p.4w9****OO*****O*****O***2**2O22;;0<qqr$rrrr6r$rrrrrrrrrr$rr$rrrrrrrrrrrrrrrrrr$rrrrrrrrrrrrrrr$rr$rr*99;91r19O999;99#qq.#*9O99*O99O9O,9O99,,OOOO9999O,,,,,,,9,,9,99O9O99999999,99,,,,@,@&&&@@@@@@@@;9;@@@@@@&&&&&&&&&&&&&&&&@@@;@@@@@@@&&&&&@,,,;,,;,;08800,,0880&,;;O2O21*;0;0@O;00880088000088%88&,08,O,,,9OO,OO9OO,OOOO22026$rr$r$r$$$$$t$$$q20;p............4...4... ...4....4",
-".4.ii..wXw...i.i................................u..u....u...4.4.i..4iwii4X99002O2**9*O*20050;*9**999999**O*******oo**1**********Ooooo**2O*292.4#2***Oo**O*******O***OOO9*9O;;;001qqqrt$t$rrr6r$rrrr$r>r$<<rrr<$rrrrrrrrrrrrrrrrrrrrr$rrrrrrr<$rrr199*1rrr29O9999;2aq pOOOOOOOOOOO9,OOO9O,,O,9OO999OOOOOOO9,,99999,,9999,;;99;,,,,,9,@@@@@@@@@@@;;;,,@@@@@&&&&&&&&&&&&&&&&&&&@@&&&&&@&&&&&&&@;@@@,;;;00;008088880;;,O2*1;0;,,00008080&0;0@;,,;088@@;;;,O,,,,@,,;;OOO,,;2222@26rr$rrr>>r$r$$rr$6*,2au q..........4...4.4.4.u.4....",
-"..4....u.ui.i.....i......................u....................4..4.i.4.4iq*900900****O*O*90009O929*2**9************o*9o****o**oO**O*******2*******o***o*o*****o**O*O;9;0;;;;p*a1p.qq$rr$rtr$rrrr$rrrrrrr$rrr<rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr<rrrrr1r6<rrrp*9999;;##pOOOOOOO,OOOOOOOOOOO9O,O9,O9OO9OOOOOOOO,,999,,,@@@,999,;,;;,@@;,@@@@@@@@@@@@@@@@@@@@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@@,;08888080,OO;OO0%888000,;;;,088&8888@@,,,,,;&08800,,,,,,@@@@,000O;,O;080pr29p$$r$r$r<$r$<r$$$$1pqqqq..............4.4.4...4..4..",
-".u.4.uu......................................u....u..4.......u4.....4.ii4w*;OoO099******OOO080099O***O*9************o9**********ooo********o**OO***OO***O**o***OO2;2;;0;;00pi410w.qqr$tr6r$rr6rrrrrrrrrrr<r$r$rrrrrrrrrrrrrrrrrrrrrrrrrrrrr<r<r<rr<r<rrr1**ppra1rr*OOOOOOO9OO9999OOOOOO,O9OOO9O9OO9OOOOOOO,999,O@@@@@,9OO9@;@@@@@;,,@@@&&&&&&@@@@@@@@&&&&&&&&&&&&&@&&&&&&&&&&&&&&&&&&&&&&&&&&@@@80@,,&&8=088;@O,8&0@@;O;,,;@08888@@@@@@,,,,,;88&@,,@@,@@@@,@,0&;0;OO8&,Oqa;,*6r$r$rrrr<rr$r$><r6$qqq-u......u..4..u..4.4...4..u.",
-"....u.uu.u.....i................................................4....4...iX*99********O***O*000o*******O*****************#*O*****o$*********OO***o*OOo*OO*o****9*4i4w11 wiii4100<.qq6r$rr6rr$rr$rrrrrrrrrr$rr<rrrrrrrrrrrrrrrrrrrr$rrr$rr<r<<r<r<<r<r<rr1<6>r11$12O9OOOOOOOOOOOOOOOOOOOOOOOOO9O9OOOOOOO,O,,,OO,,,,@;;,99O9;;9@@@@@@@@&@&&&&@&@@@@@@@&&&&&&&&&&&&&&&&&&&&&&@&&&&&&&&&&&&&&@@&8&8&&8@O;00,@;&880;O,,;,,,,@;0&888%8@@@@@@,;,,;888888,,,,,,@,,@,O;,,,2*,8@O2rr,O;r$<r$$r>r><>r$<<>$$6$qq.q...........u.4....u...4...",
-"u.u.uuuuu...........................................u.........4.....4.4.4.4uw292X**O*****O*o0070***O992******************#****O***o********oo**OO**O***O**oO***pp*22ww11iii4w0;;;201q6$t$r$rr6rrrrrrrrrrrr$r$r$rrrrrrrrrrrrrrrr$rrr<rrrrrrrr<<1<<r<<<<<rr111$1999OOOOOOOOOO9O9OOO9OOOOOOOOOOOOOOOOOOOOO99,,,9O99OO9;;;,;,;@@,;;@@&&&&&&@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@&&&&&&&&&&&@&@,888&8880@,;0&80;0&800000;O,;;0888888@@@&@&@,,@@@088&@@@@;@,@@,,,,OO,OOO208@O*6p;*1r$r$<$$r>r><r>:<$6r66qqqq......u.u.u...u.u...u...u.",
-"...u...................................................4........4..4.4....4.44*9*oO*9**O***;*O00OO**O999*************************$:-$******o****O*O**ooO*o**9*o*OO2;p44iiii 00;;;0;1rqa$r6rt$rr$r$r$rr$rrrrrrrrrrr$rrrrrrrrrrrrrrr<rrrrr<<<<<<<<r<<r<<1<r1999;@9OOOO9OOOOOOOO,OOOOOOOOO999O9,OOOO9OOOOOO,9,;;,O;,9;;@@@@@@@@@;;@@&&&&@&&&&&&&&&&&&&&&&&&@&&&&&&&&&&&&&&&&&&&&&&&&&&&&@;;,@@,@@88&88;@,;088@880@@0;;;O;88&&888&@&&&&@,@@,&&&880@@@@@@@@@@;,OOOOO22O08&,O1$12r$r<r>rr<$<$>r><>>$<$$$$qqqq.uu.u.u.....u....uu..uuuu",
-".u...u.u............................................................4.4.4..4i4X992*9929*9**;*O*oooO9*O9O*999*2********o**o*****p6::>--$o******o****oOoO**OOO****OO214ii..iiw12122021< qqqaq66r6rqr$rrrrr$rrrr<$rr$rrrrrrrrrrrr<rrrrr<<r<<<r<<<<<<<<<<<<r<11222;9OOOOOOOOOOOOOOOO292;2O9O9,,9OOOOOOOOOOO99;@;&@@@;;@@,@@;@@@@;;@@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&;&&&@00088&80@@@000,0&80;@,,;00&@@@&&&&&@@@@@&&&@&&000&@@@@@@@@,O,,O22OO,,;0;,Orr6p9r<<r<r<r$r$r$<<>r$<t>$t$6qququq..uuu.uuu..u.uuuuuu.u.",
-"..u......................................................4..4..4...4.4...i.i4i4o990;99OO*2*O**2**o*O**O*999999***************ooq1**$-$$#*OO*****o*o**oO*Oo**O**OO,;*. i.ir ii4i4a1i10.   aarqt$6$a$a$trrrrrrrrrrrrrrrrrrrrrrrrr<r<<<r<<<<<<<:<<<<<<<<<r<r<<rr9@;9OOOOOOOOOOO90;0;099OOOO,9999,99999O99O,;;@@,@@,@@@,O*;@@@&@@@&&&&&&@&&&92;;&8&&&&&&&&&&&&&&&&&&&&&&&&&&&&0&&&&&&&&&&&&&@&&&0;;@@&888800,,,;0008&0;@&&@@&&&&&&&&&&&&&&&&&;0@@@@@;@;;@,,OOOOOOOO,O00O21>tap,2$<<r<r<r>r><<r<><$>r$r6$6qqq.quuq.u.u.u...u......u.u",
-".u.u.u..............................................................4.4.i4.4i44o99999222**o*00*000*o*O*O*O9**999*****************OO**9;91******o***oo**OoooO****9O2;111  1riiiiiiiii...    wa aaqqq6qq$6r$rrrrrrrrrrrrrrrrrrr<rrrrr<<<<<<<<<<<<<<<<<<<<<<<<<<p,;,OOOOOOOOO;0;20;OOOOOO9OOOO9;;9;,99,;O,,;@,OXo2,@,oiiX9&@@&&&@@&&&&&;;*q-44*8&&&&&&8&00&&&&&&&&&&&&&&&&&&70&&&&&&&&&0&&@,@&&&&&&@&&&&88080;0,@@0@@&&&&&&&&&&&&&&&&&&&&&&@00@@@@@@,@@@,,,OOOOOO,O,O;;p$rr$1*1r<r<r<>r<<<$<>r>r>$$<$r6qqqququ.u.uuuu.u.u..u.u.u.u.",
-"u.u..............................................................4.4.i.....i4i4*;9909OOO*00000800000*o***OOO*99******************OO**$121::1$1OO****OOoo*OOOO**O*9**2*2111#ii.iiii......   w    qqqqqqqqqtr$rrrrrrrrrrrrrrr<rrr<<<<<<<<<:<:<<<<:<<<<<<<<<r<r<r2,9OOOOOO*O90OOOOO,O*9,,9999O9O9;;,9;;;;,;9,*iwiw9@;**w;@@@@&&&@@&&&&@p q .0@&888&&880:::&&&&&&&&&&&&&&&&8&0&&8&&&&&&00&&&&&&&&&&&&&&@@&@&8808@@&@@&@@@&&&&&&&&&&&&&&&&&@,;0&,;@@;;;@@@,OOOOOO;OOOO,;prrrrr11><<<<<r1r><$r>r<$<>$<$t$6qqqq.u.qququ................",
-"...............................................i....4..u....u..u....i.4uiui4i442;900999**20000800;000o00o*O****O*o*************O***o:$9;9*>>11oOO99OO**o*OOOOO*9ow1**9**w4i..iii....... .....  .   q  qaq$qr$rrrrrrrrrrrrr<rr<r<r<<<<<<<<<<<<<:<<<<<<<<<<<rr<r299OOOOOOOO9;OO9O2;*4p*,9,,O,,OO;;;99;;@;;9OXXwwi*;9*pw00&@@&@&&@&&&&;i.i*0&8888&&&88:7::&&&&&&&&&&&&&&&&&&8&&&&&&&&@@&&&&&&&&&&&&&&&&&&@&&@&&&@,@@&&@&@@&&&&&&&&&&&&&&@@08@,,@,;;,;@@@,OOOO,O*OOO,2p>rrrrr2;1>><<<11r<r<rr><$>$<$t$$6qqquuq.qu.q.qu..............",
-".u.u............................................i.i...............4..4.i4i4.iii*;9999999O**00008000802*7*oO***o********************o-99991$$992***1*******OO*o#w4.*;p.i4ii.i................... ..      qqqa6rrrrrrrrrrrrr<<r<<<<<<<<<<<<<:<<<<<<<<<<<<<r<<<<r9,OOOOOO9,OOO*w*O9,,Xi4*@,,O9OOO;;;99;;0;0;X.w.wwwpXi..Xp;@@@@@&&@&&@0ww.w;8&&&&88&880::0&&&&&&@@&&&&&@@&&@&&8&&@&&&&&@00&&&&&&&&&&&&&&&&&&&&&&&@@&&@&&&&@&&&&&&&&&&&&&@;8;,,O;,;;;@,,,,OOOOOOOO;,,a$rrrrr>;,;211<<<><><$<>r>>r>$$>r$66qq ..q.qq..................",
-"...........................i.i..............4.i....u..uu.u.u........i..4i4.4iiw99OO9,9999O2990000;08O008;***O***********O****OO****$>*99*9*pOO91##>#********w4i4i.p#4.i...4........................ .     qqqr$rr$rrrrrrrr<r<r<<<<<<<<<<:<<<<:<<<<r1;0;2****o*9O9OO9**22,2w.44*,O@@*iXo;@@,,OO;;;;;;;;@@*iwiwX.wi.ww.wiX2;@@@@&@@&&0w.w.40888&&888&&@@&&&&&&&&@&&@&@@,@@@@@&&@@&&@&&&0&00&@&&@@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@O,,,,,;,,,O;,O,OOO,,O2O,;2r$rrrr$119;,@;9r<<<<<$<>$<$$>$<$$6r$qqqqqu.q....................",
-"................................................i.............u..4.4..4.4.iii.i9999999999999;9220;880;0000**O*O********************$>**9*9O2**>1******oooo*$4i....44........................... ..  ....   qrqtrr<rrrrrrr<<<<<<<<<<<<:<<<<<<<<<<<<r2;;,O999OOO2299O9*u44w...22i2;9,;w44Xw2@;9O,;@;,;;;@94wXww.i4iii.wiwwiX2@@&@@&8=&;i.w.X*&&&&888&@@&&&&&&&&&&&&@@&@@@@&&@@&;;&88&&&0&&&@@@@@;@@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@&&&@;00O,OOO9OOOO,,OOO,,2*rp2p$<rrrr<12;2;;p1<<<<<<<><$<<$$$$<$>r$6qqq u...........u..u..u..u..",
-"..u............................................4............u.......i..4.444i4i*99O99;999999;0;O000;0;00080*OO**O9*******O*********1$**O*O1::>1***o***oO*O91...ii....................................... .  qa$t$rrrr$<<r<r<r<<<<<<<<<<<<<<<<<<<<<>2@,,O;,,,,,OOOOO9*.     4;24ip;;@@2*4i4X2@,;;;;;;,@@@wiiiiw*922oXiiii.44;&&@@&&&8&;www4909&8&&&&&&&&&&&&&&&@&@@@@&&@@&&&8&00&888&&&&&@@@@@@@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@&&&&&@,200OOOOOO9OOOO,OO,,2p6r<$<<rrrr<<121<<2<e<<<<<>r>$>$$$$6r$rt$66qqqq..........u.............",
-"..........................................................u.......4.iui.4..4ii4o9922990;99;99@8;28000985050o*OO999**99**O*O*O**************o*****o*ooo*O*oow.4........................................... . qq66$rrrrrr<$rr<r<<<<<<<<<<<<<<<<<<<<r>*;;,,;;,,,;;,;2*w  . .  .*2i.iw;;@&02w44*&@;@@@@@@&&&;2**;;@&&&&0;*w*op;@@&@&&@@&8&0  .p1q9&&&&&&&&&&&&&&&&@&&@@@@@@;888000&8&@&@@@@@&&@@@@&0&&&&&&&&&&&&&&&&&&&&&&&&&@&&@@&&&&@&,,,,OOO,O22OO,OOO,,,*6rrr<r<<rr<r<<1p<:e<<<<<<<<>r$r$$6tq6q6$6r6qqququ..........u.u..u..u...",
-"...u..............................................4.............ii.i4iu..iu.4.i*2*0099;;;;29;@8&O8%80o28800OOO*99999999**O*OO*********O***O******ooo*O*o#.4i...4......................................... .  qqaq6r$rrrrrrrr<r<r<<<<<<<<<<<<<<<<rr$p;;,,@;;@;,;;2 . ..    4p&@i...4 *@&&0;X20;;0;02ww;;2O@&@@@@&&&&00&&@@@&@&&&&&88@&&01 w40&@&&&&&&&&&&&&&&&&&&&&;@&@&088888&@&&@&&&&&&&&&&&&&&@@&&&&&&&&&&&&&&&&&&&&&&@@&@&@&&@@@@;;;OOOO2#*OO,OOO,,,2arrrrr<r<<<r<<<9,1:<<<<<<<<rr$t$66qq$qq6666qqqq.q......u.u...........u..",
-"........................................4...............u......4.4......i..4.i4*99**9099;;;;;&&&O08O0009050oO*O9999999999****OO**********O*O***ooOooOO*444..u.................................... .. ...  .     qa6q$r$r<rrrr<r<<<<<<<<<<<rrrrrrrra;@@,,,;@&@@@;w ww2w .  .w&@i...114p@;X2pX0&;@2pwpp,@&&@@&&@&&&&@&@@&&&@@@@&&&@&80@&0w.w.98&&&&&&&&&&&&&&&&&&@&&&0&&888888&&&&&&&&&&&&&&&&&&&&@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@&&@;;,2OOO2*a12O222OO22prrrrrrrr<<1<<<r<9,0<:<<<<<<r$r$66qqqqqqqq6qqqqq.u.............u....u.....",
-"..u.......................................................u........4..4i4.4.4.4w999*00;09;;;;@&0O80202;0880**OO999999999;9*O****O*O**O*OOOOOOOO*oooo**w4...u..u........................  ........... ... ...  .  q ra$$rrr<<<<r<r<<<<<<rrrrrrqaqaq2&@@@;;;&&&@&0iww *.  . ip02i   ##.4*&*4iXw0&&0ww w2@@@&&&&&&&&&&&@@&&@&&&&&&&&8&@@&;iw wq0&&&&&&&&&&&&&@&&&@&&&&&&88888&&&&&&&&&&&&&&&&&&&&&@&&&&&@&&&&&&&&&&&&&&&&&@&&&&&@@@@,;,,,922p$$*2pr$r2,02q$rrr<<<<r<<1<<<1,;;<<<<<<rrr66qqqqqqqqqqqqqqqqq......u.u....u...u......u.",
-".........................................................................i.4.i.4o9992809;;;9;;;0;8*OO*;0000*OOOO9*999999;999*****O***OOOOOOOOO*ooooo*Xui....4......................................  . .   .. ..    aqr6r$rrr<<<<r<<<rrr$$rqqaqa  w;&&@@@@&&&&&;i w... . . ... ...ww.w;;Xiiw4*0@@@2w#2@@@&&&&&&00&&&@@&@&&&&&8&&&88&&&X4www.*8&&@&&&&&&&&&&&&&&88&@&0&888&&&&&&888&&&&&&&&&&&@00&&&&&&&&&&@@@&&&&&&&&&@&&&&&&@@,,,,,,OOp$rr61$6rrp9,;026<<<1<r<<<<<<<<*O;r<<<<<rrr6qqqqqqqqqqqqqqqqqqq.u...................u....",
-".u................................u...u.4......4........u............ui...4.4uii4*99*0800;;;;;0000Oo2758800*O*O9999992999999O**O*O*OOOOOO***oOoooo*oo.4.4.iu....................................... . . ..   .  ..    qqarrr$rrrr$rr$rrr$6q       u;&&@@&&&&8&0 .............ii.ip0&&;*Xiww..w;&@;21rp,@@&&@&&&&&&@@@@@@&&&&&&&8008=88;w4..u*8&&@&&&&&&&&&&&&&&&&&&@8008880&&&&&88&8&&&&@&@@@&8&&&&&&&&&&&@@@@@@&&&&&&@&&&&&@@,,,,,,,OO;;w12p1rr$p22,,0*<1<<<<<<1<<rr*,9*<<<<rrr66qqq qqqqqqqqqquq.qqqu.....u.....u...u..u......",
-".....................................u.....4..u............qq......u.......u....4i*992002;@&@;;00029O00;7000*OO9999999999999O***O2O*OO*OOO**OooOoOOoiu....4.u.u..................................... . . . ... . ..    qqaqaarrrt6$r$r6qqq       ..2;2;&&&&&;p4....wwpwXX**XO@;*.Xp;&;4iw.i.iip00w.p1r*,@@@@@@&&&@@@@@&&8&88&&&&&0&888&&;X.w20&&&&&&&&&&@&&&&&&&&@@0&@0&8388@&&&&&&8&&&@,@@;@0@@&@&&@&&&&@&@@@,,,&&&&&&&&&&&@,,O,,,,,O92,2O;921$r$61,OO2rr<r<<<<<<1*22,O*<<rr$r$qqqqqq qquq.ququq.uq.u.....u...u....u......u.u..",
-".................................uiu..............u.u..q.uq....u..u.u..u.uuu.u.u.uX*9920;&&&;;@;0929O22;808;OOO9999999*99999OOO*OOO***OOO*OOoooo****.4.u..u......u....................qq... ........   . . .  . .  ...  qq qqraaqaqaqqqq      . ..w.4ii;2wXXiiiip2;@@@@@@@&&&&&24..4iwi..iw.w.ippw.. ##*p;@2rp;@;XX;&&&&88888&&&&&&&&&&888088&&@@&@@&&&&@&&&&&@@&@&880&0888%80@88&&&@&&8&@@880&080@@@@@@&@@@@@,@@@@&&&&&@@,,,,,,,,,,O2999O921rrrrr$p2OO21<r<<<e<e12;2O99<<<r$r6qqqqqq qqqqq.qqu.quq.uq.u..........u.......u.....",
-"..u...........................................i........u..u.....u..u.u....u...u...4*29;;&&&@@;;@;;;;*2*;0702o*OO9999999999999**OOOOOOO*OOO**ooo*O***#4..4...u....................................... . . . .. . ..           qq  a qw  .   .. ....i...XX2X.w4i00@@&&&&&&&&&&&&80i..w.i.X..i.i.w.i*22*r1prr$1<<#**#p@&&&88&&88&88&&&&&&&&&&8&&@@&&@@@@@@@&@&&&&&08@000&088&&8==8888&00&8%8&88&&@&8@@;00@,,@;,@,,,,,;@@,@@,O,,,,,,,,,OO999992rrrrrrrrr2OO21<<<1p**1*922;22r<rr66qqqq  ..ququ.qu qu.ququ.......u..u.......u........",
-"........................................4.......u.......u.q......u....u.uu..u...u.u4299@&&00@;&;,;;9009*089ooOOO99999O9*29OOO*O*****OOOOOOOoooOOO**w........u.......................q .............. ... . ..  .  .        q             .. ....X.iwi.i&&&&&&&&&@&&&&88&&&88&88&Xi.i....X.wi...w.p20;pwrrrrrrr202r1;&&888&&88&88&@@&&&&&&&&&&&&&8@&&&@@@@&&&00&8&&@;0;O&8%%8@88&8&&&80&888888&&&@&00&80@,,;;;,2,,,,,,OO,,,,,,OOO92O2999;92$$rrrrrr<*O2*1r<11;,O22O2*2111<<r$r$qqqqq.qqq.uquq...ququ.quq..........u...u...u...u..",
-"......................................4.......................u....u.u.....u...u.u.4w**2;;&&@@&@@;0;70o*;00*O*O99;O999999**OO***OO**OOO2*OooooOO*oX.u.u...4.....................................  .. ... . .   . ..                 . .... ...iii.i.i42&&&&88&8&&&&&&888&888880Xi.w..iwi..i..w...w.4 arrrr11r1r1ar*@888888888&&&8&@@&&&&&&&&&&&&&&@@&&&@@@@088800@00;,,0888%88&&8&&&&&&&&&&&&&&&&88&0&88@,,,;,,,,;,,,,,,,O,,,,OO,;999999;9;<rrrr$1112<<1<r22222*2;<<<<:<<rrrr$qqqqu .qqq.q..u qq.u.qq. u.u..u..u...u.......u....",
-".............................4.....u......4..4........u.uuq.....u......u.u.uu.u.uu.u.44p2;&&&@&@@;2;00**2;0*OOO;;;;;9OO99**9OO**O***O2O2*OOOOoO*w4u.....u4.u.....................................   .   . . . . .                .   ..  .......iii4X;&&&&&888888&&88888888888&@w444iiiiXwwXX444iww#w##rr11111rr1#9&&&8888888&&&8&&@&88&&&&&&&&&@&&&&@&&@@@&8@@0808;0@@0;@888=88&&8&@&&&&888&&&&0&&&088%8&@,,,,;,,,,,,,,,,,,,,,,O999999;9O;0$rrrrrr1pe<<122p22211p<<<<<<<<$r$trqqqq .qq.q.qqqq.uuqquuqq.q.......................",
-"................................................4.......q...u.......u.....u.u..u.u......42&;;@&@@&;2O0*oO*;OOOO;;;,;;99OO9O9**9**O*O*2OOO*OOO*o.u..u.u....u...u........................q......... . ... . . . . ...           .     ...w ........ii2&&&&@&&&888&8&&&&88888888888&;;;oiX..iX.4*00244.w#rrr<<<<111r*;@@&&&888888&&&&&&&&&88&&&@&&&&&@@@@@&&&@&&@&00@,,&0@&@,088888888&@@@&&&&&&00&088%808=8800,,,,,,,,,,O,,,,,,,O,22929992;9;0<$rr<<<1<<<<;,;*1pe:ee<<<<<<<r<rrr$r6qqq qququ...qq.quq.u.............u.............",
-".............................u..u..4.4..4....u.............q..u......uu.uu.u.uu.u..u.u..u*@00&&&&@@;90oOOoOOOOO,;;,,;9OO9O229*9**OO**Oo**OOO*#.u.u......4..........u.u..............................   .   . . .   .          .    .........i...iip&&&&&&&&&&&88&8&8&888888888&88&&&8&X4i.X40====0;14i.w1:::::<<$*&&&@&&&888888@&&&&&&@&88&&&&@@&&@@@@@&&&&&@@@,@@,,00&0;;;;88=8=888&@@8@&&88&@&8880088888808;,;O,,,,,,,,,,,,,9999O9999;9*;;0<r<<<<<<<<<<;;1e:<e<<<<<<<>r<$<r$t$r$qq qqq.qqq.qquq.uqquuu.......u.............4..",
-".......................................u...4.......................u....4.u.u..u..u.....u420;20&&&&;229*Oo*OO*O;;;,,,;9O9O9;9*99*OO*OO***OO*o4u.....u..4....u....................................q.. ...  . . . .    ..........   ..............iX0&&&&&&&&&8&&8888888888888888888&&&&;ow4440==888=800;p#$1111112@&&&8&&88888888&&&&&&&@&888&8&&&&@@@@@@&&&&&&@@@@@@&00;9;;00&&=888088&&;@&@@,@&88=8088088%808;08O,,,,,,OO,,O9999999999999;,01><<<<<<<<<e*2<<<<<<<<<<<<<<rrr$rr$t$qqquq.uq.....u.uuqu.q............u...4..4.....",
-"..................................u........................4.i4.u....uu.u..u..u..u..u.u.uuw;;440&&&@;90*O*OOO9,,,@;,99O9OO;;9*99***OOOO**OOOwu....u.....u.......u.......................q...... ....... . . .. .   .           .. .   .....wiiiwiw000@&@@&&&8&888888888888888888888&&88880*40==888888===888@9;888&&&&&&&&88888888&&&&&8&&&8%8&@&&@@@@&@&&&&&&&&@@@&&0@0999;;;,,,8==8888;80@@0&&888800888%88888808;0O,,,,O,OO,O9999;,;9299;9;0::<<<<<<<<<<::<<<<<<<<r<rr<$r$rr$$t$6qaqq uqqqq ...q.q....u...u....................",
-".....................................4......................4.i.i.u....u.u..u..u.......u.u42@pu20&@@@;29OO2OOO;2,,,,O;92;;;;99***4. .X**oO**pu..u...4..u.u.u.......u........................... ..   .. . .  .  .  ..    .....  . ... ..  . i.i.iX@00&&&&&&&8&88888888888888888&&&&&88&&===8==88888888888888&&888&&&&&&8888888888888&22;&&&&&888&8&@@@@&&&&&&&&&&&&&@;@;@;,,@;@;,;&888&8880888880@;00088%3%888%80,,O,,,,OOO,OOO2222;;2;9999;;::<:<<<<<<<:<<<<<<<<rr$r$r$6$t$6ttatqqq  q.u.q.q......q.q.........u.....4..........",
-".........................................4...................4i.u...4.u.u.uu.u..u.u...uw..ui2;p400;@@;2O;;OOOO2;,;,OO99;;pwwpwpp1u4uuu..uoOO*4u....u...........u...................................... . . .. . .               .   .. .i..i1wiii;&0&&&&&88&8&888888888888888&&&&&&&&&&&====8=88888888888888&&0&&@&&&&&888888888888804i40@&&&&&&888&@@&@@&&@@@&&&&&&;@&@@&&@@@@@@,OO;8=8=80088880;;00%=88+3%8880;OOO,,,,O,,OOO9*29;99;;;9999;:::<:<<<<<:<<<<<r<<r$r6$666t$$6$qqqaqqq ... .........................4.............",
-"..................................................................u..u....u.u..u..u..u.w.u.u4*;pw;@&@;O,;;,OOOO;O;,O999* u4u4u..4i.....u.uoO2#u...u.....4............................................. . . . .. .   .    ....  .. ...wpw2 i*;44*0&&&&&&&&88888888888=88888888&&88&&&&&&888=88888888=88=8888&&8&0&0&&&&&88888888888888X.i*&@@&&&&&@&&&@&@@@&&&0@&&@&@&&&&&&&&,@@@@@@@;O;8==88888%%%3=88%888%=800,OOOOO,O,,O99OOO9;;99;9;;99990:<:::<<<<<<<<<<<<rr$rqqaqaqqqqa aqqqq  ...q.........uq.............................",
-"..............................................................i.......u.u.u..uu.uuuu..uu.u.uw10*4X2&@;,OO2;,OOOO;2OO99w44.u.u.uuuu.uu.u..uoO2*u.....u..u.u.u....u...................................  . . . .  .  .  ....    ... . ..wwp*2p*w288&&&&&&&&8&8&&888888=88888888888888&&&88&@@8888&888888888888&88&0020&@&&88888888888888;4.X20&&&&&&@&&00@&@@&&&@@&&0;&&&&&&&&@,,@@@@@;@@,O,008%883=83=&,8&0;000,,OOOOO,OO,O,OOOOO9999999;999;1:::::::<<<<<<r<r<rr6qqqqqqqqq  q   q q ........................u....................",
-"..u.................................................................u..u.u.u..u.u.uu.u..u..ui20014i2@;O2O2,;OOOO22O99*4uu..u.u..4.u..u4..uoOO*.u.uu..u..u.u..u....u.........u........................ . . .  . ..w .w.  ....   . ..  wwi4ww4w888@@&&&&&&&&&&&88=8888888&88888&888888888&,,&888&8888888888888&8&&1 10@&8888&&&8888888889i.4.0&0&00@&&&&@@&@@&@@@@@0&&&&&&&&@@,,;@;;@@;@@,,OOO00&8,;88,O2,OOO9,OOOOOOO,O,OOOOOOOO92999;999990:e::::<:<<<<<<<$r<rrraaq          .  ... ...........................4..4..4..4..4..4.",
-".....................................................................4u.uiu.u.uu.u..u..u.u.u.4w20*44;@OO,;,,;9OOOO*O9*4u4u4.u.uu.u.u.....u.oO*#u ...u..4.u.........................................  . . . .     . ..  .     . .........i.4p888&&&&&&&&&&&&&&&888888&&&&&&&&&&&88&&8&888&@&888888888=88888==8&&&0r$2@@&&&&&&&888888888894w.X*;2*.0&@@@@@0@&&&@@@&@&&&&&@@@@@@9O;;@@@@@@;;;,,,,,,OO,OOOO,,,,O,O,OOOOOOOOO,OO9OOOO9;9;999999::::::::<<<<<r$r<r$$rqqa          . . ...............u.........u..4...................",
-"..............................................................i.i......u...u..u.u..u.u.uuuu.u.44;044p;;O22,;;,OOOO**9ou4.uuu..4.u.u.u..u...X**.uuu u..u.4..u..u....u............................... .. . . .     . .   . ..  . ........iii40888&&&&&&&&&&&&&&&&88888&@&8&&000&&&&&8888&&&&88888888&88=88888888&&91r10;,,,@&&&888&&888880004wi4.0*p00&0&&@000&@@@&@@&&&&@@&@@,;,,;,@@@@@;0@@;@@,9OOOOOO,OO,,,O,,,,OOO,OOOOOOOOOOO9299999999<<<:::<:<<<<r<<rr$rrtaqa   .     .. .....................u.....................u......",
-".................................................................i..4.....u..u.u.u.u.u.....u.u.4;0144w;;O;0,,;9O**O;;.u.u...u.u..u.u.....u.u.w... . .u.u..u..................u..................... . . . . . .   . . . .   .  .......i..4w888&&&&&&&&&&&&&&&&88888&&&8&&8&@00&&&88888&&&&88888888888888888888&&@;$w10,,,@&&&&8&8&88888&804i4w0&#iwwop*02*o*2pp@&@@&&@@@@@,9;@@;,,@@@@@@@@@@;0,;;OO,,OOOOOO,O,,,OOOOOOOOOO,OOOOOO9O99999;1<<21:<:::<<<<rr$rr$r$qqq     .   . .  ........................u..................u....",
-"...........................................................................i........u.u.u.u.u.uuX00$44X;@O;O2O99O**994u..uu.4..u..u.u.u...u.uuuuwouuq.u.u.....................................  ... . . . . . ... . .  .     .   w.X.X.iiX8=8&&&&&&&&&&&&&&88888888&888&&&&&8&&&&8888&&88&888888888&8===8=8888&&&01 #0@;,@&&&&&&&&&&888889w*108&*iXiw.i4i4iX4X42&@&&&&@@@,,9,,@@,@@@@@@@@@;@;0;;22OOO,OOOO,,,,OOO,OOOOO,OOOOOOO2O9999991:<<2O1e:<<:<rrr$rt$trqaqq      .   . .. .........................u....................u.",
-".................................................................i.i...u......u...u..4.4.u.uiui.u4*0r4uX0;O22OOO***O9.4u.u4u.u.u.u..u....uu....i.#....u...u..u.u............................... ....   . . . .  . .w. .  . .  ......i..i40=88&&&&&&&&&&&888888888=8888&&&@&&&8&&88888&&888&&&&888888=====88888&&&&;.#r0@,,@&&&&&&&&&88888&8=888&000*iwwwXXwwXw.w20&&&&@@@,;@@@@@,@@@@@@@@@@@,;09;;99,OO,OOOO2,OO,,,OOO,OOOOOOOO9O2299;2<r1p,2<<<<<r><$r$$$tqqaq         ..     ...............................u..u..u..u........",
-"...............................................................i.......i.4.......ui.4.4.4.4.4..4.u4p14.4X;O,OOO*O****4...4u.u.uiu..u..u.4woooo4uuu4.. .u...................................... ....... . . . . . . ..w.   .  ..  ....iw4w=88&&&8&&&&&&888&88888=88888&&&@&&&&88&8888&&8888&@&88&88888888=88888&&&&&p rr0;;@@&&&&&88&88&888&8888&&090piwXwXwXwwX.4w;@;@@,@@,@@@@;,,@@@@@@&@@@;;;00;;2O,O,O,OOO,,,OOOOOOO,,OOOOOOO929991$rrr*,2r<<<<rr$r$qaqq aq   .      .    ..............................4.............u..u...",
-".......................i....wrii.............................i..............i.....u..4...4.4.4....u44.444w2;;*O*o**o*.uu.u.u.u.4.uuu.u..oowo**oo. u........u......................................... .. . . . . . .     . ..  .....X.iw888&&&&8&&&&&888888&&8888=888&&&&&8&&88&8&&&&&888&&@&8&8888888888=888&&&&&&&*. ;;;&&&&&&&&&8888888888&&&8&&80X.wwwXXXXwwX.2;,@;;@,,;@@,,,@@@@@@@@@@@@;;00:19OO,,,O,O,,OOOOOOOOOOOO,,9O,O9*paaqarrrr21$<rrr$r6qaqq      .....         .     ............................u..u..u..........",
-".u..u.......................#w 1..............................iX.....u..u..4..4....u4.4.4.4.4.4.4.4.uu44wi2;29OOoooo*.4.u.u.u4u...oo4.u... u.ioo*o.4u...u. .i....................................... ... . . . . . .    . . .. ...X.i.4;=88&88&&&&&888888&8&888888888888&&8&88&&&&&&8&&@@@@@&8&&888888888=88&88&@@&@;i.9@08@&&&&&&88&8888888&&88&&&=04X.ww.Xw.XwXiw;@@;2;;;@@@,,@@@@@@@;@@@@;1:1<<1;O,,29OOOOOOOO92OOOOOO**O22Opr  w wa$arrrrrrrrq6qqqq       .  ...         .....  ....................u...............u..u..u.",
-"............................i.Xww#.............4..........i.....i...4.u..u......u.ui.4...........uu4.....i*O*OOOo*o**ou4.u.u..4io*o*ou4......uu.oo*o..4.............................................      . . .   . .   .     ...w..iX4*8===88&&888888888888888888888888&&88&88&&8&88&8&@,,@&8&888888888==88888&&@&&0p.*&000@&&&&&8&&8888888&&88&&804XwwX.ww.wXwwwiX;;X*,,,@,,,@@@@@@@@;@;00>rrrr<1;,,O9,OO2OOOO9992OOOOpqq#2X.i.w. w wqaarqarqrq$qqqw    .  . . ...              . ...  ....................u..u...u...........",
-"..u..............................w# ..........4................i..4...4.u.u.u..u.u.444.4.4.u.uu.uu4u.u.u4i2***oOOo****wu4.4u.44o*oo*.u...u..u...u.oooo..iu..u....................................... ... .. .  .... . .     .... ...i..42==88&8=8=8888888888888888&&88888&&&8888&&88888&@@@@888&8888888888888888&8&@@pwi*000&&&&&88&888888888888880pXww. w..wiwXwiX.X442,,@@;9,@@@@@@@@@@&01rrrr1rr12,;,O,,OOOO2999O92Op. .#*pi....w     wqw$wqqqa q        ..  ..      . .  ...... ..................................u....u....",
-"................................i4*1............i....................4..u.....u.u..u..4.4.u.uu.u4..4.u..uuX9***Ooo*oO*o4.u..uuiooo*ou..u.........u.i...4oo*oo....................................... . ... . ..    . . .  .........wi.i4;=8888888=8888888888888888888888&&&&&888888888888&&@&88888888888888&88888&&&;p.w4p&&&@&&888888888888888888wiww  w wwww.w.wwXwwi2@,@@,,@@@@@@@@@@@1<t111rrrrr#O,9,,OOO,,992929;1. .p;9*i.X.X.. ww w     w     q   .... . .           . .    ......... ...........................u....u..",
-"...u..............................#w...............i.........i........4.i4.4..u..uu.4..4.4.u..u... uu.u..u4Xo****ooOOoooq4u.q ooo*o.u4..u.....u..quu.u..w****o#u.................................. . . .. . . ....  . .  .   ... i.....i*==88888888888888888888888888888&&&&@&888888888888&&&&&&88888888888888&88&&&&;i.w490&&@&888888888888888880w.w. .w.w.wwX.X..wXw41;@@,O,@@@@@@@;@01trrrrrrrrrrw*;,O,OOO,O,9229O;*i .2@;w.w...w ..   wwpaw.        .   . .                ...   ....... ...................................",
-".u..............................................i...i..i.i...4..........4.4..4..u.....4...u...uuu..u.u....uuiwo**Oo*oooooooooooo**o4..u....u...u.**..4.ooo*o..w.o*o............................... . . ..... .    .       ... .... ...iii8==8888888888888888888888888888&&&@&&8888888888888888&888888888888888&8&8&&&&0w.wX0&&&&8&8888888888888&24w.w w  ww  .w..XwX.wip,,@@,,,@@@@@@@@1arrrrrrrrrraw.2;O,;OOO,OO222922w..w*wiw.Xwi.w.w w .2;2       .       . .             .    .. .....................................u.u...",
-"...............................................i....4ii4.4i...........4i..4i.4.u.u.u.u..uu.u.uuu.uuu.u..uu..4u4ioo*0;*Oooo**ooooo*ou4...u....u......4.iiiiiu..i............................................  . ..  ....  .w#.w.. ... ..iw888888888888888888888888888888&&@&@&888888888888888888&8888888888888888&&8&&@&0iw.o0&&&&8888&8&&&&&8804i.w     ww .w w  w.wwiXX;@@,,,@@@@@@@;pqrrrrrrrrrrrwwwO,,@;O2O22;9O2929*.i.iiiiX.w...w..  .9O,w....  .      . .          ....  ....  .  ...............................u........",
-"..u................................................ii.4..............4..4.iui.4.4...u..4....uu.u..u.u.u....uu4uu44p**O*O**ooo**o**ouu.uu..u.u..ui4.4.i44.i...44.i..................... .............   ... ..  .   . ..  .wwrip ....wi.4288&88&88&88888888888888888888&&&&&&&8888888888888888888888888888888888&&&&&&&&0X.ww9&&&&&88&&8&&&&02pw.. ww.w.w  . ww ww wXiw.4,@,,@@@@@@@&0pqarrrrrrra#wwwww;,02OOO229222999OO2w.w.i#.w..X..w.. w2O,w.  . . w               . .      .   .. ................i......................u..",
-"....u........................................i.i........4.4...........4..4.4.4.4.u...uu.u.uu.uuu.u.uuuuu..u...u4u.44wooowwoo***oOo4...#oqu...u.i.ii.4..ii4ii4i.i4...i.i.#......... ................... ...  . .... .       ..ipwi.....i4088888&&8&&&&&&8888&88888888&&&&&&&88888888888888888888888888888888888&8&&&&&&&0*pXi*8&&&888&8&&&824ii.w. w  . . w . w  w .wXwXi2@@@@@@@@@;1wawawwraarwrw#wwww*;pXo,,,2O9OO2O2O2O2..w.X.ww..Xwiw..2O9*i.. .      .   .     .. .  ....  ...  ... ..................i...............u.....",
-".............................................i..i.......................i...4...4u..u..u....u..uu.u..u..u..uu..u..uu44i.4u4X**Ooooo**oo**.4u.i.i4i4i.i.4..ui.4i.i4i.i.ii..........q.... ............  ... .. ..     .       w#w.. .w..i*8888&&&&&&&&&&&8&8&&88888&88&&&&&&88888&8=88888888888888888888888888&&&&&&&&&&&@0*ii*&8&&&88888800wi. w w. w.w w. wwwwww.w w.wX.X;@@@@@@@@wiw#wwwww#a#wwwww.ww.XiXX,,,O,,99999OOOO2ii..w..X. . . 42,2..w....                 .  .    .    . . . ................i..4.4..................",
-"...u....................................i.i...i..........i...4.4....4..4.i4i...4..4.u.u.u.uu.u.u.u.uuu.u.uu...u4.u4.44u4.4.4X****ooo***O*o4..u.4ii.ui4ii.i4..i.i4i4i4iii.w............q..q............... .  .   ....  .     w........4;888&&&&&@@&&&&&&&&&&&&88&&8&88888888888&888888888&8888&&8888888888&88&&&&&&@&&@&&02iX0&8&&88880*wi.w  ..  .w . . .w.w.w w. .X.XXi*@@@@@@@@w. wwwww wwww#w#ww..X.wXi2,,O,;229;,2OO2Owi.w.w..  . . .w2,ow....    .     .    ... . . ... ..... .. ....................4i...................",
-".....u.......................................i...ii....i...............i.4..iu4.4..4..u4.u..u..u...u..u.u..u.u..u..u..4.4.u.uXXXo*ooo**o*o.i4ii4i4.i4..4...i4.i4.ii.i.iiiw.............. ............... . .. .  .     .   . . ... ww.ii&&&&&&&@@@@@&&&&&&&&&&88888&8888888888888887&88888&&88&&&8&&888&&&&88&&&&&&&&&@&&&@*40&&&&80;p4..w.. w www w w.www w w.w.w.w.w.wXX;@@@@@@@pXww ww w#w ww ww.wXiwXXi*,;2;;22;2;229OOoi.....wiw .   .*;*;*pw.  .    .      .        .   .   . . .  ...............i.iii4.u..u.....u..u....",
-"...............................................i..i....4..i.4..u........i.i..i.i.4..4.i.4.u.....u.uu.u.u.u..u.u.u4u4u....u.4.u44iXX*ooo**44i4i4i4i..ii4.i.i.i.4.i4i4.iii..i........... ................. . .. .  . ... ...      . .  ..i0&&&&&@@@@@@@@&&&&&&&&&&88&8888888888888888870&&&&&&&&&&&&&&88&&&&&&88&&&&&&&@@@&&;;2208;**X4iwww. www   w w w .w.ww .ww.w w.X.iX4;@@@@@@@*.wwww wwww wwwwwwpXXXXXXi2,220;;2;;9222OXiww....w.w. . .22ww2pi. . .   . .   .        . . ........ ..  ............i.ii4i4.iiiuiuiu........4.",
-".....................................i...........ii.i..........i...4..4.4i4.4.4ui..4.4u..4.u..u.....u.u..u.u....u..u.uu.u...4....uu o**o*.i4i4i4ii4i.4.ii.4i4i.4i.iiiiiiiii........... .............. .. . ..        . .      .  w   ..i0&&@@@@@@@@,@@@@@&@@&&&&&&&&&&&&88888888888&0&&&&&&&&&&&&&&&&&&&&&&&&&&&@&&&&@,@&&@@;0p*Xi.wwwi44www1w w w.w  w .ww ww.ww.w X.wwXi*@@@@@@@p.w...ww w.w w .wppXwwXX.w2;*X*;,2;2;,9O,o..Xw.ww.w ..w.#w2w ***#.. .      .   ..       . . ........  .   ............i.i4ii4i4i4i..4.........",
-"..............................i.....i.i........4i....i.....i.4...4i..i.i.i.i.4..4i4.4.i.4.4.i...u.uuu.u.u4.i.4u.4u4u4u4u.u.4..iuu..4 o1ooiuiii4ii4i.i.4.ii.4i4i.4i4.4.ii.ii.......................... .  . .     . .. . .  . .     .  .ia00;9,OO,,O,,,@@@@@@@@@&&&&&&&&&&888888888&&&@&&&@@@@,@@@&&&&&&&&@@@&&&&@@&&0;@@@0@0;24iiiX44.p00i wwwww.w w    .w.ww.ww.w.wwww.wXi2@@@@@;iww www wwwww.wXw#pXXXXXX#2;wXiw,,,2;,OO;p.Xw.Xwiw......pwi**pw**.  . .       . . ....... . .......  ..  .........i.i.4.i...iii4i.4i4.........",
-".....................................................i...i......i.i4.i.4.4....4.i..4..4..4.4...u.....u.u..u.u..uu.......u.u.4.u..4..4qo*o.iiiiii4ii4i4i4io*iw.i.i.iii4.i.ii......................... .. . .        .      .       .  . ..a29O99O,,OOO,@,,@@@@@@@@&&&@&&&&&&&&88&&&&&&&@@@@@@@,,@@&&&&&&&@@@@&@&&@&&&@@@@@@@0;&*4wpp0088=8X.w w  w w ww wwww www w w.w.ww.XXo;@&@@;i.wXwwwww.w. .w.wwXXXXXXXw2;iXXi*;,;22;;*iXw.X..w ww.w.pp..2,ow*o....   w.        .      . .      ...  ...............ii4.i.4iii4ii4..........",
-"...............................................i..........i4....4i4ii4i...i4.4.4.i4.i..4..4.u..4.u.u.u..u..u.u.4.uuu.uu..u.4.u.4.u.u.io**o4iiii4i4i4u4.oo*woooo444iiii44..4............... .....  .. . . . .. .    .   . .      .     . .iw;9999O,,O9OO,,,,,,,,,@&&,,@&&&&&@,&&&&&&@&&@@@@@@,@@@@@@@@@@@@@@@@&&&@@&&,@@@@@@@&&&0&&88888=0X. w w. .w .w    ww w.ww..w..w.w.XX;@@@@1iiw w.ww.w.ww.ww.wXXXXXXXw;*iw.X.*92;0*wiw.iwwX.ww.w ..*piww*2**p .. ...w        . a.... . ...... .... ...........i.....i.iii.iii4i4i.4.4...u.",
-"........................................................i.......i4ii4iii.i....4.i...4.4.4...........u.u..u...u.uu...u...u.u.4...4.u..4wo**.ui4...i44io********oopp.i.p*.woii...........  .q   ...   q    .    .          .         .  . ..iw*9999999O92999O99O,,@@;@O,@&@@,,O@@@@@&&&@@@@,,,,,,@@,,@@@@@@@@@@@&@@@&@@,@&&@@&&&&&&&88888=;4.w . www.ww.ww  w.wwww.wwwww.wwwX42@&&2p2iXwwwwiw.w..w.wXXXXXXXXXw;*piw.wwr2;2i.X.XwX...w.i .w*wi  .;2*X*p..             . .    . .     . ... .................i.i.4i4w4ii4i4..4.4....",
-"..............................................................4i4ii4ii4i4i4ii4.4.4i4...4....u.u..u.u....u.u.u4.u.4u4u.uu.u.4.4.4u.4.u.4..o*o.ooooo4uo****OXooo*oOOo**OO*1#qi.......... .q. .       q  q    . .     .       .         ..  ..i1*9;9999999O9OOOO99,,,,9OO@@,OOOO,,,,@@@@@@@OOO,,OO,,,@,@@@@@,@@@@@@@@@@@@@&&@&&&&&&&&888888X.. ww w. w.  w    w ww.ww.w..wwwiwio@&24*@2iw.w...XwiwiwiwXXiXXXXXX;@*iwiwi#0* ..wwX.ww.ww.X.w*w..w..pw4oO*u.           .  .. ... .. ...... .  ................i.iiii4ii i4i4..4.4.....",
-".........................................u......q.............44i4i4i4iiiii...i.4....4....4....u...u.u.u.u.u..u.uu..u...u.u.4.4..u.u......oo**Xioo.io*ooo*oooo*OOo*OOOO**::4i.......  . .. q      q. q qq q                      .    .  ..i12;;9;999OO*99*9999OOOOOOOO,OOOOO,OOO,,O,OOOOOOOOOOO@@,@,@@@O,@,,@@@@,,@@,@&&@&&&&&&&&&&88824ww.w w w w  .w.www ww.wwwwww.w.wwwwi*;X4;,0wiwXwXX.wwiwi.XXwwXXXXXp2,;i.wi.wwiwwww.ww.wwi.i..#w.  ...o9*2O2.. . .    . . .... .   . .   ..... ...................4i4.i.4ii.4.i..4...u..",
-"....................................u....q..u.................44i.4i4iXiXi4i4.4..4i4..4....u.4u..u..u.....u.uu.u.4uu4u4..u.4.4.u.u..u..u.4iioo44X*oooooooo*oo*OO*O**OO****2 4........  q    q q q. .  q q  . q q  .  ......  .        ..  ...10,;;999999**99999929OO,O,OOOOOOOO,OOOOOOOOOOOOOOOO,O,O,O,@,@@,@@@@@@;@@@&&&&&&&&&@@@&&&8&4 .w w w. w .w  .w .w ww w w.w.w.Xww.wiiwi2;;2iXXXwww.....w.ww#XXXXX.w;@w4wwww.wi.X.wiwwiww.wwiw.w. ..*2*OOO2wi. w..    q.    . ...     . . ... ......................i....i..4.4..4.....",
-"..........................................q....q...........4i...4ii4i4i4i4ii.4.44.4..4.u.u.......4.u.u.u.u.u.4u4uu.4.uu.u.u.4.uiu.uu.u.....4i.i.uo*oooooooooo*****Oo*O*OOO@;*4i..... .. q q q q q qq.q q q q  q q         .  .          . r .w12;,9;;99;9999;0;929,,,,,,OOOOOOOOOOOOOOOOOOOOOOOOOO,OO,O,,@@,@@@@@@@@@@@@&@&&&&@@@&&888*.w w w w w.w .w. w w ww wwwwww.w#w.Xwwwwwi2@;*iwwiwX..wiwi.XwwpXXXXXXio@;*iiwXwiww.Xw.XwXiwi.iw2w..w .*i42OOow...  .      ....        . . . ........................4iui..i..4.4.4.......",
-".......................................................4.......4i4X4Xi4iXi4i4i4ii4..4..4.4.4..u4u..4u.u.u.u..u.u.4u.4uiu.u.4..iu..u.u.u..uu..u..4Xoooooooooo*******Ooo*O*o2@;:4i...   q   qqqqqq qq q q     .qq   .   .     .     .     . a   .$1;;;;;9,9;;0;0;0;2**Xo*O,OOOOOOOOOOOOOOOOOOOOOOO9OO,99,O,,,,@@@&@@@@@0@&@&&&&&&&&&&&884w.w.w w.w w w w . w . ww w.w w. w .ww w.wiw;2www.ww.wwiw.ww.wX.XXXXXXXi*;@2.i.w.w.Xw.X.X.wiw..2,*w..##w..p22..i..    .             ...... .........................i........4.4..........",
-"...........................................u.u............i....iii4X44i4i4i4ii4i4.4i.44.4.4..4..4.4..u4..u.u.4u4uu.uu.u.u.u..4u.u..uu...u..u4..u.ioooooooo*o*******oOoOO*OOO;214u.qu.  qqqaqqqqqq qq q q q qq   q.q   .    .      .     . .  . i.w;0;0;;;;;;;;;;* ... .*,,,OOOO9,O9OOOOOOOOOOOOOOO9OOOO,,,@@@@@@&&&@@@@@@@&&&&&&@&&&8*i w w w ww.w.w w w.w.www w www..w #ww.w.w.wwiiw.iwXwX.w.X.X.wXwwi22o*4Xio,,@;iiwX.X.wiwXwwww.i*;,,0*www. .iwp....    .         . . ...i..................................4......4...u.....",
-"......................................................i.i....i.iiiX4XiXiX4ii4ii4.i.4...4.4.4.u4..4.444.u..u.u.4.u4u4u4u.4..u...u.u...u..4.4....iui*ooooooo*o***O**oo*OO****O*O;2;;;21q  qqqqqqaqaqq   q q.  q q.  . .    .       .  .  .         .i1;;2*ra wp*r .     .p0;9;2OOOO9OOOO9OOOO99OO**9OOO9,,,,@@@@@@@@&&@@&@@&&&@&@&&&&804w.w.w ww ww w w . w w w w ww wwwww w.w.w.w.w..ww w.ww.i..w.w.w.iip@@;24iw;,@@*i.ww....w.Xwiio2,,,&,ww. .w. .iw.. .      .        .   .............................................4.......",
-"..u........................................u..........4..i.i..i4iiii4i4i4ii4i44ii.4.4.4.4.4u.4..4.4..4.u.u.u.4.4u.u.u.4u.u..uiu.u.uu..u..4......4ioooooooo***oooooo*oooO*Oo*oO2O,;@@02q qara$6rqaqaqq  q q qq  q q   ..   .      .  .   .         .. r ..   ....        rr .w9999OOOOOOOOOOOOOO**99O,,,,,@,@@@@@;@&0&@&&@@@&&@@@@&&0X. w w w w   w.w www.w w w w.www w www.w.Xw.w ww.wiw. .www.w w w.wwiX,@@*4i9@,@*4wiXi*pi.Xwiip29O2;2w.. w . ..www.w. . .            .. .....................................................",
-"........................................................i...4.i.i4Xii4iXii4i4ii.4.i4i4.4.4.i4..4.4.444ui..u..u.u4u..4uu..4.4.444.4....u....4.4.u.iooo***o**o*ooooo***oOooOo*oOo*O2,;@@0rqrq6$tqa$aqqq q q qq q .           .       .       .        ..                  .. .#w29OOOOOOOOOOO*OO9OO999,,,,@@@@@@@@@@@0&@@@&@@@@@@@&&0X. w w www ww  w.w ww w. www.w w wwww.ww w.w.w.w.wiw.w.ww..w w....w..XX,@;94o@@@*iXw#.ww.X.wwo2O22O;pi. .     .# ...... . .  . .  .     .     .. ..............................u..u.......u..",
-"..........................................u..u...........i.i.i.iiii4iXi4i4.ii4i.i.4i4i4.4.4..4.i.u4u4.4.u4.u.u4u.u.uu4.u..4.44..4.4.u...u.....4.4ioOoo*******oo*o***oo*oO**oOOo*OOO2OO92qatr$rrrqaaqqqq qq qqq q q         .      .        .                            .   .i*9OOOOO9OOOOOOOOO9,99,,,,,@@@@@@@@@@@@&@0&&&@@@@@@&0w.ww ww w ww.w   w w ww  .ww www w.w www.ww.w.w.www.w..w.w.wiw.wwww.wipXX;;;O4*@@;wiwwXiwiii2;29O292;2.. . .w. i.. ipw. ..   .w    .   .. ....... ....................................4..4....",
-"..u....................... .......................u...4......ii.4iiiii4iXi4.4i4i4ii4i4i4444444.4.4...u.4.u..u4.u..u..u.uu..4..4..4.4.4.u....4..4wp29oo***o**ooo**********OO****OO*OO*oo*qr$tr6$trqraqqqqq q q q q q                                     q                 . .w2OOOOOO9*OOOOOOO;,9O,,,,,,@@@;;@@;@@@@@@@&&@@@@@@02X.w.w w # w.w www.w w w ww ww.w wwww.www w www.ww X..w.w.ww...  .w..w...wXo99;;2p2@*iXiw.i2*#9O222292@;w........#w.i**w.... .w.   . .        .  ...............................................",
-"...u..............................................4.4..i.4.i...ii.iXiiiiiX4iiii4i44i4i4i.4.4.44.4.u.u.4.u..u.u4u4u..u.u.uu4..4u.4.4.4.4......u.42*oOo*********o*O********o***oOO**O**O**#$r$rrrtqaaqaqqqqq q   q qq                       .             q          q        .p9,9OOOOOOOOO999,;;;;,,,,,@@@@;;@@;@@@@@@@&@@@@@@0pi.w.w.w wwwww w . w w w.w  w.wwww w.wwww wwww.ww.ww ww.www ww..  wwi..wwiXoX*;9@@2w**iXXwww@@@;229292,;@0wip**pw*;w..;;w..w.w .   w   ..   .. .. .....................................4.......u.",
-".u.......................... ..............u....u......4.....i4i.4X4i4X4X4i4i.4i4ii4i4..44444..4..4u.u.4..u..u..u..u.u.u...444i4.4.4.4...4i.4.4$*oooo*****o*o**o*o***o************O****Oo:$t$rt$r$$qrqaqa qq qq                              .                              .p999O99O,OOO99,,,;;,,,,,,@@@@;,@@@0;@@0@@&&@@@@@0w.wwwww w ww w ww ww.w w w w. w ww.wwww w ww.w.ww.ww wwiw.w.. ..w.w...wwwiw.www9,;@;;*wXiwwio@@@@22229OO@Owi*2**O2;wi.i;2wwi.i....... .         . . .......................................u.u....",
-"............................................q..u..........4.i.i.iiiiXi4i4i4..iii4i4i4i..44.4.i4.4...u.u.u.u.u4.uuu.u..u.uu.4.44.4.4.44.i...4.4p0oooooo***o*o*oooo**o*o**o***********O*O**:>rrrrr6$aaqaq qq  q   q                                     q q q q          . w  .2,9O999,999999,,;;;,;,,,,@@@;;@@;210&@@@@&@@@@@0w.w w w w w.ww w  w. w w . w w ww ww.w.wwww ww.ww.w.ww..ww w.w wwXw.ww.w.w.X.iwwo9;;@;2pwXwiXw@@@@;,2222,@piX*44.Xwii.iw1wwpp1X*pi...     .  .  . . ...............................................",
-"............................................u....u..u.u4.......i.i4444i4iii4i4i4i4i4.4i4.4444u.444.u.u4u.4.u.u...u..u..u.u..4...44.4.i4.4...u4;*ooo*oo**o*oooooooooo*oooo**o**o**O*******1::>rtrr6rqqqqqq qq q                                 . q          .  .            w229,O;,,,,,92,,,;;;;,,,@@@@@@;@@2r<0@@;@@@@@&@;#.ww ww#w w w  w ww w w   ww  w www ww.w w.ww ww.wwww.w w.wi   w.w .wiw....w...w*4*,,@,9pX4Xw.i;@&@,O22O2@;w4w;o*;;2iiiiw*wiwp;@@;*wp*.... ..... w.w..... ..................................4.......",
-"........................................u.....u.......4..4.u.i..i.iiii4ii4ii4iii4i4i4.4.44.4.44..4u.u..uu.4.u.uu.uu.4.u.u..4.4....4..4i4..i.4p2oooo*o***ooo**oooo*o*oo*ooo*o*******o**O****:1#a$qtqaaqaqqq q q q                        q   q   qq    q q       .           .*;;,;,,;,;9,,;,;;;;@@,@@@@@@@@@&2<0@@@@@@@@@@@p.ww ww w # ww.w w  w w ww. w  w ww .w w.www.ww.ww.w.www. w.ww. .w www X .iw..X.i*oX9O@@@9w;wiXwX;&@;O2,,@;iii*&@@;**p2ppi*w4***;@9;w 1po*wi..  . ww.ww..w .....................u...............u....",
-"................................................u...u...........4.i4i4ii4ii4i.4....4..44..444u.4.4.4.4.4.u.u.u..u.uuu.4.4u444i...4.44.4.i4..4;2oooo*oo*o***o*o*oo*oooooo*ooo*oooo*o**********oo#1>t$qqqq   q        .           ..                q                         .p0;;9;,,,99,;9,,,@@@@@@@@@@@;,@@20;@@@@@@@@@;p.wwwww w w w. w.w w w w w  w ww w .w .w.ww w w.w w.w w  ww..w.wwwiw..Xw.w.w.ww...4p.2@O,@,202.pw42&&,O,,@@24ii2@@@p4Xw*p#4Xi4wp4w**;w4#*OO9*pw.i.i...pp ..p# ........................................",
-"...................................................u..u....u..i...ii4ii4i4i..4..4..4..i.4.4.444444..4.4.u.u.u.u4.uuuu..u.44.44444.444i.i4..i400ooooo*o*ooo*ooooooooo*oooooo*oooo******oo*O*o**OO*:$ qqqq w q q                  .        .    q   q q                        .*@,;;,,,,,,,,,@@@@@@@@@@@@@@@@@@@@;@;@@@@@@p.wwww ww.w w w w w.w w w w w w  w w w. ww.ww  ww  wwww  w www.w .w w..w..ww..wi.X..XpX;,,@@@0*#9wiw;;@;@@@&2i.w@@*;;wii4X2*w;;;2iw2,;2#**99*OO92w ..... ...ww*w i............................u.u......",
-".........................................u.u..u.....u..u.u.u.u...i.4i4ii4i4i4.4..4i4.44.i444.4.4..4..4.u.u4..u.u...u.u.4...44i444.4.4.4.i.i44p*o*oooo***oooo*oooooo*oooo**ooo***o***o*OOoO**Oo*O*1O21121 q                       .           q                            . . 4*0;,,,,,,,;,@,@,@@@@@@@@@@;@@@@@@@@;@@@@&;.w wwww w ww w w w w w w w.w w     w.ww  wwwww. .ww w  ww w..w. ww.w.w..wi X ..w ...iXXX;;@@@2iwwwwi4X*ww2@;*iw.*;w,@*iXii2;w2*X;w4p;2;99O**O**O9O91a.... ...iw##w.....................................",
-"......................................u..qu.q........u.u.qu.u..i.....i4ii4ii.i.4.i4i4.i44i.4444444.4.4u.u..4u.u.uuu.u.4.44.4444i4444.4.4i.4i4q1ooooooooo*ooo*o*oooooooooo**o****oooo*o**O******29O,;;,&&;#..                      .         .q                    q    w.    . i*;;,,,,;,,,,@@@@@@@@@@@@@;@@@@@@@@@@@@&@*.www www w. w w.w w..w w.w w www w  w  ww  w w w   www. .wwww. ..w.w .w..w.w..wiw .w.Xiiw;@;@2iw.X.w..i.iXp..wiw4;*w@;wXi.44iiii4wwiXiw29999*O*OOOO**1ri.i...4p*p......................................",
-".................................uquq....u...u..u...u.u.u..u.u.4..4....4iii4i4i.i4i4..4i44444.44.u4.4...4.u..4.4u.4u.4.4..44i4444i4..i.4i4i4#00oo**o*ooo**o**oooo*ooo*oo*oooooo*oo*oo****OO***O*OO,,,O,@@;r..... .             ....                            . .       .  . .  2;;,;;,,,,,@@@@@@@@@@@@@;;@@@@@@@;@@&@;ww.w.www ww ww.w  w   w.w w . w    w w w .w. ww w.www .ww.w..w.w.www.w..ww...w.. . ...i.X.X2;@94iiwwiwX..wwiwwiwi#0oX*;p.wiXiXiXiiXwwwXw4.p*9*****o*OO91..#ww##9*ii  ............................u......",
-"........................................u..qu......uq..uq.....u.....i.4iii4iii4i4i4i4i4i4iii.444444..4.4..i4.u4.44.4..4.4.4i444i444.4.ii4i44p80oo*o*oo*ooooooo*ooo*ooooooo***o*o****oOo*****OOOOOO22,O,@@@211$.w .             .                               ..       . .w...q$1;;;,;,,,,@@@@@@@@@@@@@@;;@@@@@@@@;@@02w.w.w w w  w  w .w .w.w w.w ww   w w w w w   . w w.   w.....w.w.w.w.w.ww..Xww.w.. .w.w iiwi4**2o*w.i.iiiwi.w.X.wwwpp4XpwwiXiiiiii.iw1p#2iX441********2O9*p#**11pX4..1.4.................................",
-".................................u..u..q........u....u....u....u..4..ii4X4i4i4..i4i4i44444.4..4.4.4.44.u4.u.4..4.4..4..4.4444444i44.i4i4..44X0;oo*oooooooooo*oo*ooooooooooooo**oo**********OO*OOOOOOO,O,@@,2**$i               ....   .                               . .  . w. $r;,;,,,9,@@@@@@@@@@@@@@@@2@@@@@@@@@@;@0ww.w.w wwww ww w    w w w w .w w     w w ww www w.  w...w.w. www.w w.w.w.w...w.w.w. ..wii..iiX2@;;2ww**pwpw w.i.XwiwXXiX.i.XiXiXiXi.i4124.ii$*O*****O**O;;#iw#.i...i#1ww................u...............",
-".....................................qu..u.q........q..u...u..........4i4ii.4i.4i4i4i4i4i44.4.44444u.4.4.4.4..4.u..4..4..4i4i444444i4i.4...4.00ooo*oo*ooooooooo*ooooooooooo*oooo***o***oo*OOOOOOOOOOOO,,@@,OO;1iw.            .       .           q                      .   .   .2;;;,@,,@@@@@@@@@@@@@@@@;0@@@@@@@@@@@0p..w.www w w w.w www.w w w ww  w w    w w w .  ww.. wwww... ..w.w.w.w.w.w.w.w.w.w.wwiX...i..iww2,@@;@@@0;*wiwwwi.iXwwXiiXiiww.iX.i*piiXii..i1*22*******O;*4i4ii......iw*. ..............................",
-"............................................u......u..uq.u.u.........4iiii4i4i..4i4i4i4444i4.4...4..4.4.4.4..4.4.4.4i4..4i.4444ii..44.ui....u410oo**o*oooo*oo****oo**oooooooooo*o*********O**OOO2OOOOOO;;,OO,@1..             .         .                              .    .    i#@,;,,@,@@@@@@@@@@@@;@@@@0@@@@@@@;@@@0w w.w w ww www w.w   w w w.w .ww w  w w w.w.wwww ww  w.. .ww.www. w.w.  w.ww.w.w.w....w....iwiiiXp**O;@@;;;pwww#wwwwX.wpwow2pwwwpi2wiiii..iw92;;9O**1#p*O2pi.. i.....iw*.##..............u..............",
-"....................................u.................uq........4...4.i4i4iii4.4..i4.44iii4i4i4.44.4.4.4.4.4.4..4.44.4.4.4.4i4i44..4..........4;2o;9o*oo**o*****ooooooo*ooo***o***o*****Oo*OOOO2OOOOOO,OOOO,,;* .. .          .         .                              w  .  w  ..w;@,,@,;@@@@@@@@@@;;,@;;@;;@;@@@@@@@@0w. w www  w w w  . ww w . w .w  w w  .  w..w w ww.. ww.w.w.www.... w.  . w..w.w.w..w.w.wiwiwii.iii4.4wo*w222*;;;;*p;;2**w*;2*XXiXXXi.X...iiwpw4p;,;;q4iX*O;w4 # ......4w#...w ..........................",
-".....................................................q..u...4.....i4ii4i4iii4i.i..4.i4i4..i4i4.444.u4.4.4.4.4.4..4...4..4.4i4.4.iu4.....4.4...u10o2*o**o*o*oo***o*o*o*ooo*o*o*o*ooo**ooo*o*OOOO,O,OO,OOOO2O,,,Oi..  .                                     .                   .  .p0;;@;,,@@@@@@@@@@;@@@;;@;;;@,;@@@@@@@24w w ww.## w  .w   w w ww w w w   www .w w w w.www w. . ww.wwwww.w.w w ..ww.w.w.w.. ...ii.i.X.w....wiii.iii.wpwX29wwXXX2;2wXiXiiiXiiiXi...i.i.ipp**i. iw**;pw#i.w.i.......pw...........................",
-"..................................................uq..uq..u...4......4.ii4i4i.4i4..i.44i4.4i4i4..44.44.4.4.4.4..4..4u.4.44i4.4..4i...u4........41*ooo*oo*oo*o*o*oo*ooo*o*o**o*oo******OOO*OoOOOO,OOOOO22O**O@@*iw.. .         ...   .                      .            .  .  . . i000;;@;;@@@@@@@@@@;,@@;;;;;0@00@@@@@@;w.wwww.w.ww ww  w.  w w .w w w       w w.   w  w..ww. w. ww w w.w.w.w.w.wwww.w.wiw...w.w.iii.iiwi.i.w.wiw..i.ii.w;9iw4*@X4iXX.iXii.iii.i.i.....4i.4.w..i#*2;*#Xii..i......ww#w.........u...............",
-"............................ .......................qq.q.uq.......4.i..4i.4i4iii..4.i4i4i4.4.4...44u4.4.4.4.4.44..444.4.4.4..i.4..u..u.....u...u10ooooo**ooo**oooooo*o*o*o***ooooo****OOOo*OOOO,OO,O2OOOOO22,2i.... .                 . .   .           .. .                .  . .4*0@;;@;@@@@@@@@@@@@;@@;;;;;@00;@@@@@@@;i w..w.  w w ww  w w w w w w.   w ww . ww.w.w .www. w.www w ww. .w..w.ww.w.w...w..w.w..wiw....X....i.i...X..i...iXwwwpXiXXiiXiXiXX.iiwiiw.ii.i.i#w.....iiiX*X.wwi........4.#p....w.4.......u..........",
-".......... ....................................u......u....u........4....ii4i4i4.i.4ii4i4.4.4i.4.44444.4.4.4.444.444.4.4.i.4u4..4.4.u.u..u...u..40;;*oooo*oo***oo*ooooooo***o***o***ooOO*OOOOO,,OOOOOOOOO*O*p4..X. . .    .   .    ... .        .   ..      ..           .    .  ..p@,;@@0@&0;@@@@@@@@;@;@;;;;@00;@@@@@@@;.w.1ww .w.w..  .w w w w w         w  w.w. ww. ww w.www.w.www..w.wiw..w.www..w.w.X .w.ww...w.......X.w.wi...ii.wi...iwii.iiX.XXX**w1p...q ii.i.i.*o....iii..4.w.wr.i......wwu.......w...u..............",
-"....................... .............u. .u............ququ.......4.i...i4.4..4ii.4ii4ii4i4.4.4.i..4.44..4.4.4444..444.4.44..4.4..u...u.u...u...u4a02OOoooooo***oooooo*ooo**ooOo**oo*oOOOOOOOOO,OOOOOOOOOO99#.. .. . .               . . .                                . .    ..40&;,,@@,;@&@@@@@@@@@;;;;;;;0@10@@@@@;@;iw.##w. w .pp.w w w w w  w w .    w.  w ww www.ww w .wwww.w.www.w.www.w wiw...ww.w..w. .wi.w.w.w...i.i.wiw.w.iii.i......iiXiXXXw*p2;;*2*1iii..i19*i............i.i..i.... w.......i...4...u....u..u...",
-"................ ...... ..................q.u...q..uq.q.q...............44...4i4iii4ii4i4i4.i4i4.4.4.444444444444.444444..44.4..4.u.u....u.u.u...400o9oooooo*Ooooooooo*o*oo*oOO*oo**OOOOOOOOO,OOOO2OOOOOO,;....   .            .. .. . .      .           .         .       .    408@;,;&0@,@&&@@@@@&@@@;@;;;;;;00@;@@@;&;i w.wwr. wu90w w              w w . w . w w www.w. www.w wwww w..wiw.w...wi. .....w.i..w..X...X......w....i.i..i..iii.iXiXiiiX4*;@,;;9;9pi.ii.419*#.. ........iii.i.................4.................",
-"........................................u......u.....qq.uu.....u.......4..4.4.4i4i4ii4i4i4..4.4i4.4444.4444.44.4..4.4.4.4u..4..4...u....u...u....4u022ooooo**oo*o*oooooooo***OO*o***OOO*2OOO,,,OOO2OOOOO2;*u                .       .   w.            .             .         . ..8&,;&&&&@@&&&&@@@@@&@@;@;;;;;0;0;;;;@@@;.ww   ww..200*.   www w w www  w   w. w. wwww ww wwww.w ww w w ww.w.w  wwX. w..w.w..w . ....wX. ....w..X.X.w.w.w.i...i..i.wiX4w2,@;;,92*p....i4*;9p4i. ......ii....................w....4.......u.u...",
-".............................................q..q.quu..uq..qu.......u.4.4..4.44444ii4i44i4.4.4.4.4...44444.4444444444444..4..4444.4....u..u...u.4.410O**oooo*o*oo*ooO*oOOOoO*OOO**OOOOOOOOOO,,,,,O2OOOO,,w...               .    .. .   . .       .  .              .          w42&;;@0&&&&&&&&@@&&@@@@;;;@@;;;;09;;;0;00;iw ww w iw00024 w w       w   w   w. w  w w www www www w www.w.w.ww. ..w.....w. .. .......wi.w..w...w......X.w.ii.iXiiiw*22iq*,,,;;,2922wi.ii4;@92* ........i....i................i......4...........",
-"...................................................quqq.quq..q.........4.4..i...44i4i444i4i.4.4i4.44.4....4..44444i4.4.4.4444u4.4..4.4.....u.....u4<02Ooo*oooo*oooOOO*OOOOOOOOOOO**OOOOOO,,,,,,,,;OOO22;2u. .  ..           . .   .w   w  .          .                       .  408@;00&00&&&&&&&&@@@;;@@;@;;@;;;;;;;@0000w w  ..i#0000; .w   ww w  w     w     w.ww w w.ww ww w w w.w.w .w.w.w ww.ww w..   .. . .w.. w..w... ..w.w.w......wi..wip2OO;2*2,@,;;,,2p4iiiii40@O,@*.......i...i................4wwi4........u.......",
-".....iw ............ ...............................q...q.uuuqq..u....4.4..4.4.4..ii44i4444...4i44444444.4.4.44444444444444.4.444.4..u.4.u..u.u.u..4:02*00o9ooooooOO2OOOO2OOOOOOOO**OOOOOO,,,,,,,;O2OOOO2..  .   ..  . .  .. .w.... .   .            .                . .     ..o88&000000&&&@&&&&&@,;;0@@;;;9;;;;;;00000r. w w.#*;;;000w  ww   w w  w  w   w w  ww www.ww w w.ww www.wwww. .w...ww....w .w. .......... ... .. .w....X.w..i...i.1;,,,,,,@,,;;;,,,@2.4i.i4@@O,,2q.........i...................#ii...4.4.4.4.4..u.",
-"......iww ...................................qqq...qq.qu.q..q..u...4...4..i...4.4.4i4i44i4i.44.4.4.4444.4.4444i4i444.4.4.4.4.4......i4....u......u.u410;;00;*o9oOOOOOOOO,@;,OOOOO***OOOOO,,,,,,,,,O,OO;2*.. .        . . .  . . w     .   .                                  ..i*=8&@0000&&&&&&&&&&@@@@@;;;;@;;;;;;000771.ww w.90;000&0w.w w  w w a ww    ww    ww ww.www w wwww w.w ww.w .w..w .w. w.w..w . ..w. w  . ..  .. ...X..w..i..iwiir19,,,,@,2,,,@,@,,,,,;*i.4#@@O999 i. .......i..................www4...4.4.4.4.u4#r",
-"..........................................ra...qu....q.  ..uuu.q.u...u..u.uiui44.4i4444i44444444444444.4.44.444444.444444444..4u.uu4..u4.u.u.qq...q..4<00008;*0;oOOOO,;,,@@@;,,OO**O*OOOO,;;;;O,,OOOO,,91 . .      . . . ... .  . . . . .                     ..        .   . wi1=&&000&&&&&&&&&&&&&&&&0;;@;;;;;;;0077:1.w  w.#00;000&0  w      a w #   w     w w   ww www w w wwww...w..  . . . w.  ...w.w..... w...... ..  ..wi..XiiX...iiip;;;,@@,,,,,@@@@@@@,@@@@2pu;@O;;99*............................... i.4..4.4.4....w ",
-"........................................u..wrr  .uq .q...u...q......u.u.u..u.4.i4i4i4.444.4i44.4.4.4.4..4u44.4i4i44..4.4....4..4....4u....u...u.q.q..q4.100002;;;OO22,,,;@@@@;,;*OOO*OOOO9;;,2*9O,OOOO2O*.      .     . .    ..                                             ...i*=&&@&&&&@&&&&&&&&&&&&@@&@;@;@;;;;0701..w ww .1;;000002.w  www  aq a  w  w   . . .w. ww w www.w.w .wwwwwww w  w  .w . w... w .....w...w. .w..w..w.i...iXiwXi4w,@,@,,,,,@@@@@@@@@@@@@@,,2OOO,;,O1 .i...........................iw4.i4..4.4.44p1i4",
-".....................................q.......ar  qqqu.qu...q..u.u....q..u.u....u.4..444i444444444u4444u4.4.444444444444.u4.4u.4.u..4..u....u.uuu........4410;9OO;2O22;;;@@&@@;;;*OOOO22O2;;;2O*OOOOO2OOOp..     ..   . . ....  ....... .              .            ..        . .40800&@0&&&&&&&&&@&&&&@&&&@@@;@;;000o.ww   w .1;;;;0&&p w qa w q a w  w . w w www . w w    w.ww     ..w .ww.w ..   .. . . .........X.w.w... ..w...w.X...iiiX42@@@@@@,,,@@@@@@@&@@@@@@@@OOO,,,O*9w.......... ........... .......i.4.4.4.4.4..i ..",
-".....................................w.. ..... qw#qu..u..q.qu..q.....u.u....u.uu...4...44.4.4.4..4.4.u4444.44i4i4..4....4.u..4..4.......u...u.. .u..u....u4:009O00*2;@;@&@&&0@;;2*OOO,,2;;;;;;OOOOO2OOO9w.. . ... .  . . .    .                                          .   . wio8&&&&@&&&&&&&&@&&&&&&&@@@@@0;;;@9p.  w w w w#00;;000. q aqqqqa   wqww  w. w w . w .ww w w ww.  ww. wwwww.w   w   .w w...................... i.ww....Xiiu442&@@@@@@@@@@@@@@@@@@@@@@@@,,2;,99,O;*w............. ..u.........u.4iwi4.4.4.4.4.4i..",
-"........................................r....u....q .q.uquuu.q...u.....uu..u..u..u4.4.44.44444.444444u4uu.44.444.44.4.44u.4.4.4...u.u.....u..q.u.q.u....u.440000000;;;;@@@&@@&@,22OOOOO;;;,;;OO;9OO2OOO*q.   ..  . .. . . .... .......  . . .       ..    .   ..          .. .w.w408&@&&&&&&&&&&&&&&&@&@&&&&@@@;;9w.wwww  w w  0000082. aqq6qa   r#qw   w  w w  w  .w     ww wwww w .w w.ww  . ... . . .w....w........... . .w.w..w.w.4i#1;@@@@@@@@@@@@@@@@@@@@@&@@@@@@@@,,;9OO,,2*r  ..................$ ...u.....4.4.4.4.4.44.",
-"4..........................................u.....u q quuuqq.q.u.q..u....u.uu...u.....u.44i.4.4..4.4.4.444.444..4...u.u..4.u..4.4......u....u...qu.u........40&;70*02@,@@&&&&&@;;2;;;2,,;;,,,OOOOOOO9O991...   ... . . .  .   .      ..  .            .     .   .         w  . . ..w&&&&&&&&&&&&&&&&@2@&&&&&@@@;;@*.w w w  w w.*;;0000p   # $q #rq*r wqw ww.w w w ww wwwww  w w www   wwww.w w.. .w.w    .w. ..w. ..w.. . .. ....Xii qp;;@@@@@@@@@&@@@@@@@@@@@@@@@@@@@@@@@,O;,;,,,,,2.  .q..........u.....*p4.w...i..4.4.4.4.4.4.",
-".......... ..............q.................u.uuq.....q.qqu.quq..u........u...u.u.u.u.u..44444..4.44444.4.u..44444.u..4u.4u.4444.4u.uuu.uu.....q.u.uu.u..u..40&0&500*,;@@@&&&&@@;2;@;9292O22OOOOOOOOO2O,w...... . . . . .. ... ....  ... . ....       .      ... ..  . . . ..w  . .498&@&&&&&&&&&&&&@0&&&&&@@@@@;;;w  w  wwww w0@;0@00w rq www 11 qwqw wq  w w w w  w.w w ww w w w  w..w w   . .w ..... w    w .. ....w... ...... i4w;@@,,,,@@@@@@@@@@@@@@@@@@@@@@@@@&@@@@,OO,,,,OOO,pu  aq..qqu.u.......4.**i. ..4.4.4.4.4.4....",
-"............. ..............q.u..............uqquq.q.ququ..quq.uqu...u..u4.u..u.u......u44.4.4u.4..4.44..4.444...u.u.u4u.4.4.4.4...uu.qu.....uq.quu.....u4i4;80,&092;@&@@&@&&0&;2;@;;22OO*O*OO99OOOOO,p....   .   .w. .  .  . .   . ..     .w        .      .   .        w w   .w..408&&&&8888&&&&&&&&&&&0@&@@@;0@p w w w  w.200;;0&9. a wq q q   w a a  a w w w www w w w  w w      www ww .w . . w.   . .w .  w ..w..   . . ...p;&&&,,,,,,@@@&@@@@@@@@@@@@@@@@@@@@&&&@@,OO,,,,,,O,2q..w ...q.u...........ppi............4..4.4",
-"..4  i....... ...............q...i.i.......quq..qquuuuu .uuqu...u.quuu.u..u4.4.4u.u.uuu.4..4..44.4.4444.4.4.4.4444u4u44444.44444.uuu.uu.....u.uqu.qu......i40&0;;2,2O,@&&&@&&@,;22;;;9**22O*OOOOOOOOO9.... ...  .. .. . . .... .. . . ..... .  .    . ..  . . .. ....    .   . ..w.4280&&8888&&&&&&&&&&@&&&&0&@;@0p w# w  w .*0;,;@0p w  q a a qaqw q   a w   w w w w     ww    w w w.ww.w    . .w .w .  w   .. . . .. .  ......4*88&&&&@@@O@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,O,,,,,,OOO;p.  ..q.qquqq........u.w....4.........4.4.",
-"4....u...................q.u......i........q...u..q..qu.q.q.qu..u....u.u.u.4..4.4...uuuu.444.4.u4.4.4.4.u4.4444u.u4.44.4.4.4.4.4....u u.u......qq...u..4i4i4000;@;;O2O;@@@&&&@2;;;;;;2*29OOoOOOOO,9O;p....   .   . .. .  .  ..  . . .     . .        . .  . .. .    .  .w.w w w ..w40=&&&888&&&&&&&&&&&@&&&&00@0@0* w w   ww #0;;900ww q#a q qwq  awqa# w a a w w w w  w   www     . w ww.w.   w. w .w  .  .w ..  ..... w.w..w..i*&&&&&&@@@@@@@@@@,@@@@@@@@@@@@@@@@@@@&@@@,,,,,,,,O99;2u .....u.u.u.u.................u......4.4",
-".....................u.....uu....iu......u.........q.qu  .uqq.uu.q.u.qu.4.4.4.444.4u....u..444u..4u.i.44.444.4u4u..u.u4..44444444iu..u....u..u....uuiui.4.4w0020&;22,;,;@&@@@;;22;;0222;2***OOOO22**#u   ..  . .. .  . .. . . .. . . ..... .      .       ..  . . . ..w.    .  .w i4;=8&&&&&&&&&8&&&&&&&@&0&&@0;@&;.ww #wwq ww;0;0&;.# wwqwwwq rw # # qwqw w  w. w  ww   w    w. .w   w .w w . .  .w  .   ...w  .w .w. .... ....u0&&&&&&@@@@@@@@@@,@@@@@@@@@@@@@@@@@&&@@&@,,,,,,;,,OOO,*w.....qqqqqu...............u..........4.",
-"..4..u.u.u.u........u......u..u......4............u.qu.. ..u.u..q......u.4.4..44.4.4.4u.4.44.4..4.4.444.4u4.444.u.u4.4u4.44.4.4.4.......u......u.u..4.4iii4w8020@;2O;,@@&@;;,;29;;;;OOO*2*OOOO**w4uu.. .   q . .  . .. .  . . . . . . .w.w .      .   . . .  .w.    .w    .   ..  .ip8=&&&&&&8888&&&&&&&&&&&&0@0&0w w r w arrq20000p  a a w qq q  a qw w w a qw  w   w  w  wwww    . ww.w w .    .  .  w. .   ..  ....w..wX.w.X.40&@&@@&&@@@@@@@@,@@@@@@@@@@@&&@@&&&&&&&&@@,,,,,,,OO,,O,O q...q.u.u.u.u.........................",
-"....u.u.................u...u.u.u...4.4i.....u.......u.uu.q.uqq.q.u.qu.u..4.4.4.4.4.4.4..44.444444444.44u4.44.u4u4..u444.4.444444.4.4.u..u4...u.u..u.4i4i44p&00;0;O2@@@&&;OO2O2;2;292Ooo*oO**#qu....   q  q    . . . w.. . . . . . . . ....   .     .. . .w . . w..     .   .   ...i48=&&8888&88&&&&&&&@&&&&&&02ri w#a waarrrr$10p#a a a  a a q  a  a qq q  wa  w  w  ww.ww w  . ww ...  . . w.      w.  w w.    .   .. ...wii.iw1&@@@@@&&@@,,@@&@@,@@@@@@@@@@&&@&&&&&&&@@@@,,,,,O,,,,,O9* ....qqqu.............4......4..4..u..",
-".u......u...........q..........u....iu.4..i........uquq.u.u.u..u...u....4..4.4.4.4.4.4.4..44.4.4.4.444.4.u4.i4.u4uu4.4.4.44u4.4.4..4...u4...ui4..u4...4i4i4#&0;0@2,;,@@&@,OO0;2OO;;;;****OO*.i........  q      . . ..... . . . . . . .    .   .      . . .   . . w. .  .w. . .w. .w.4088&&888888&&&&&&&&&&&&&&0i ww w ra$rar<rrqq a wq rq   q q  aaa qw w w  a      w  w  .w w .  w   w w.  .  .   .   . .   .w.  . . .. ....i.i#1,@@@@@@@,@@,,;;@@@@@@@@@@@@&@@&&&&&&&@@@&@,,,,,O,,,,,OO2u..q.q.uq.....u.......................",
-"....u.....................u..u......4..i4i....u......u.uq...qq......u.u.u.u.u.u.4.u.4.4.44.444444444.444.4u4u44u.44444444u4.4444444.4u.4.44.4..u...44i..ii41&00@@O2,;;0@@;,,;2222O;;O2Ooo*Owii....   .  .q q q  . .    .. . . ..      ...  ... ...... w  . .      .  .w .w.    .w...4;88&&&&&&&&&&&&&&&&&&&&@&8w  wwa  rrr$<<rrrra r #a  aqa a a   a q qq qwa awa wq a  w w . .w.w   .. .  w     .   .  w . w . .. .w. ...w.i...ip@@@@@@@@@,,@@;,@@@,@@,@@@@@@@@&&&&&&@&@@@,;,OO,,,,@,O,OO......q.q.u.u....u.u.......4......u...",
-"..u.....u.....................u......iii.i4....4...u....uqqu..u........u.u.u.u.u.4.u.4..44.44.4.4.4.444.4u.444.u.444u44.44444i.4.4.4..4..444.4.4...444.4.44;&80@;OO;@@00&@@;,O2OO2,,29o*O*OXi..... ...  q      .. . ...   . . .   .   .   ..   . .    . . .  .  . .w  .   .w .  ... .488&&&88&&&&&&&&&&&&&&0&804ww a arrr$<<<r$raq#a  q aq   q q qqwqwqw qw  a  w q        .w. . w .  w. w . .  .      . .  ... . ..... . ..X....i;@@@@@@@@@@,@@@@@,,@@@@@@@@@@&@@&88&&&&@@@@@@,,,O@@@,O,,wu....q.q......u.....4..4......u......",
-"......u...............u..u.u.u......4..4.ii4i.i...........u..u.u.u.u.uu.u.u.u4.i4...u.4.i.4.444i44444.444i44.4u4u4.444444.4.4.444.4.4..4....4...4.u.i.iii4400&0O,OO,;0@@@@@,2OOOO2;;;;**OO9X...... .  .   q ..     .          .     . . ..  .... . ...    .w      ...   .   . .... . i*88&8=8&&88&&&&&&&&&&&88*.wwwqr ar$<<<<$rqa#q# a a  a r a a # q q qw a  wqw w www w w  w  w  w.    .. w w w . . .  w  .  w. .   ..... ...wi.*@@,@@@@@@@@@@@@@@@@@@@@@@@@,@@@&888&8&&&&@@@,,,O2,@,,O,*4...u.u.....u...............4.....u..",
-"..u......u....................u.u.......i4i.i..i.........uq...u........u.u.u..u..u..u...44.4.44i.4.444.4.4444.4ui44.4u4.444444.444.4.4..4.4..4.....44i.4i4i&0@00;2OO2;;@;;@,*2222;;@,O*O*O2X......  .      q . ..  ..         .    . . . .. w. . ... ..   ..      .   .  . . . .. . .w4*888==88888&&&&&&8&&&80iw w awrrr<<<<<r$aqa a $ q q  qq q q  a a q w a w a   w         w        . w . .         .  .  .  .  .. w. w....w..wi2@@@@@@,@@@@@@@@@@@@@@@@@@@@@@&&88&88&&&&@@,;,,O,,,O,;;pu....uq...u....u.u..u....u...........",
-".....4.u.....................q........u..............quuu...u...u.u.....u.u.4u.uu.uu.u4u..444i444444.4444u..4u.uuu.u4..4.4.4.44i.44....4.4..4.i4.4i.i4i.i4p&&;0;22OO2;;;@@@,2,,,;;;;,O*OO9p............. . .  .  .. .             .        ..   ..  .  .    ....    .    .  .  .   .   488888&&&88&&&8&&&&&824 w aa#qrr<<<<<rr$q#qw$aawqw$ q# a a aw q w  q w a w w   w w w w   w  w  ww .w   . w.w. .        .  ..  ..... . .....42@@@,@@@,@@@@@@@@@@,@@@@@@@@@@@&&&8@888&&&&@&@,,,,,2;;0q....u.u................u.........u...",
-"..4u....u....................q..u....u...u.i.4.i...u...qq......u.......u.u..4.4..u..u.u..4u.444.4.4.444.u.44.u4uiu.4.4.44444444i444.4.i.4..4..4.i..i4i.i442&02;O,2O;0;;;@;;2;;,2222O,9***1u...........  ...  .. ..  .             .     . ..   . .. . .   ...  .       .  .   .      ..4;88888888&&&&&&&&&804ww w# arrr<<:<<rr$ aq#q $ q q $ q q qw  qwa   wwqw a    w         w  w   w .  . . w    w .w. .  .. ..  . .w.w.. .. ...*@@@@@@@@@@@@@@@@&@@@@@@@@@@@@@@&&00&@&8&&&@&&@&@,,;;92......qu....u..u....u.................",
-".....u4.......u...............u................4......u.qquuq....u..u.u.u4.u4...u.u4.u.uu.u4u4.444444iuu4u.uu4.444444444.4.4.4.44.444.4.44..4.4.4.4i4i.4i4*&O;0,,;;0;@00@;2O;@,O22*OOO*1:......... ... .   ..  .. ..     ..   ...   .   . . ...  . .    ..   . .....     .   .   w  w  .4&8&888&&&&&&&&&888a.w #qq$rrr<<<:<<rrqa w arw wr q a a a aqr   wawq w a  w w  w w w w       w.  w   w  . .. .   w  .. ..w.. . .... .......w,,,@@@@@@@@@@@@@@@@&@@&@@@@@&&&&8;@@@&&&&&&&&&&&&,;2;14..........u.....u....u..u.u.......u..",
-".u.4.....4..u................................i4...4.......q..u............u..u4.u..u..u..u4.444i.4.4.4u4.u4..u4.4.4.4.444444444444.44.4.44.....4.4.4i4.i440@O00@;@@@@@@;@;oO@;O22OO*OOO:$i........   .. ..  .....  ....   .     .   .   . . .. . . .w..  ... .  .  .           .  .  w.w.p&8888&&&&&&&&8=8X.w w rrqrr<:::<<rrqa#qqw qr  arwq q q q  qw$   w   w w             w w w       w.   w w .w .  . .w.. ..w. ... ..w.......42;,@@@@@@,@@@@@@@;;2*2X2@@@@&8&@&@@@@@&&&&&&&&&&&,,,@pu.....u.......u..................u....",
-".......u..............uu.uq.qu.uu.uuquu.u.uqu........4.....uu.uu.u..u.u.uu.uu..u.4u.uuuuuu.u...u.u4..uiu4.4uu4uuu4uuu.u...4.4.4...4..i.....4.i..4.4.4i.4i42;;;O@,@@@@@@,;2*,,O*OOO*OOO1$............ ...  .. ...... .  ..    ... .   ..   .  .  ..  .   .  . .   . . ..w.  . .  .     ...*&&8&&&&&&&&&&8&w.w w#qarrr<<<<e<rrrrqa  a$wqwa q qwqwww#qaq wqwa  aq aa w w w w w w         w    w .  . w .w w. w .w.. .w.w.w.. ...w.....u2;,,@@@,,,,,@;2wwwiii4.iiw2&@&@&@@@@@@@&&&&&&&&&@;,&24...................u.u...u..........u.",
-".4u...4......u.........qqq.u..u.quuq.quququ..u...u..4u....u.quuqu....q....u.u.uu.u.u.uu.u.uu.u4.4u.uu4uu.4.4u.4.4u.4u.4u.4444444u4.4iu.4iu4.4....4..44.i44p;00O,,@@@@@;;O*OOOOOO***OO*$............q.qq  ..  ....   . ..     .   .  ..   .. . ... . . . . . .   .  . .w .     .    .w.  .*8&&&&888&&8&80..w wwqarrr<<<<<<<rraq #qwr aqwq a a qw qw r q  w  w qw a             w   w  w    aw   w ww.w . .w   ..w. .w..w. ..w.w.w.i..;;@@;,,;;@@@;wi.......i...X;&@&;@@@@@@@,&8&&&&&&&@@2i.......qu....u...u..........u..u...u...",
-"...4.............u..uq.u.u.quu.qu..quu.u.u......4........u.q....qq..u.uu.u...u.u..u.u.uu.uuuu4u..uuuuuuuu4uu4uu4..4u4..u44.4...4444.ui4.4..4.4.4i.4.i.i4i42;08O,@@@@@0@@,**OO***o*OO::i .......... .qqq .. .... . ..  . .    . .. ..  .... . ..  . . .  .. . . . ..   .. w. .  . ..   w wi0&&&&&&0&&00p4aaww rwrrr<<<:<<<rraq$wqw qwq q#a q qw aw a qaqa $wqww w  w w www w w   w q w  a w    w w  ww.  . .  w . ..i.X.wi.     ...i*;;@,@;22**22X....w...w..  .i@&2;&@@@@@@@@&&&&&&&@@;wu.....uq...............u..u........u..ui",
-".....u..u............qquq.uquuq.q.uququq.uq.u.u.......u....qu..uu.......u.u.u.uu.uuuuu.uu.uuuu.u.4.uuuuuuu.4.4uu44.u44.4.4444.4.4.4.4..4.4.4..4.4..4i4ii44;290,@@@@@@@@@;O*o**oOO2;*1.......  q   . .qqq q   .. .  .. . .    .  .  ..   .. . .. . . .w.  . . . .  ..    .w   .    w     ara;&;2aquqq-..ww arrarrr<<<<<:<rr$ra q# wa q#qa qwq q $a$r qr     wq a a     w      w   w  q   qwww    w  w.  . w  ..w...X w...X .  .   ..i*;;;;piu...u.   ...... ..  .2;u0;&,@@,@&&&&&&&&&&@24.....q......u...u...u.........wu....u.iu",
-"..4u...4..4.u.........u.uu.u u...uq.ququququ........q..u..u...uq.uquuuuu.u.u.u.uuu...uu.uuuquuuuuuuuuuuuuuu.uu.4u444.44uu...44444444444.i..44.i.4i4.4i4i4w00;;@@@@@@@@@@@2OOOpoOO;024......  qqqqqqqq.qqq  .  ..... . .    .. ..... . ..  ..  .... ... .  . . . .. .     .           qaa$r$666qqawaqaw wqr#rrrrr<<<:<<<<rraqw$wqa wr a  q qwa ar$a$raa aqaqq w$ qww w   qwqwq w w www a     w   q  w w. . .  ...w..i.X.       ..    4wpw..        .w.w .. .   .q.4a210@,,@@&&&&&&&&@@0X......q.qu.............u..u...up*iu.u.4..",
-"u...4u..............uu.quu.qu.u..quuqququuuqquqqqqqqqq..........u.uqu.u...u.u.uuu.u.uuquuu.uuuuuuuuuuuuuuuu.4u.u444.44.u.4.44.4.4.4.4i4.44.4..4..4.4i4i44208;;@@@@@@@@@@&;;2O2>>wppi......  qqq6qqq qqqqqq.  ....   . .    . . ..   . .. .......   ..... .. . . .w .     .         wqar$r<<<>>rrr$rr$rrrrrr$r<<<<<<<<<<r$rqr   qw rw a a a qqar$rr$a#$ q    wqqwqw    w w       w w  q  w       w    .  .w   .  .......   ..  .    .  ..            .... . .     .1::>;,@&&&&&&&@@@;@24.......q.......u...u............2wiu.4u..",
-"..u....u.u.u4.u.u.uuquq...qu.q..q.q.qqqq.ququqqqq-q-qqq..uu..4......u...u.uu..uuuu.uu.u.u.uu...uuuuuuuuuuuuuu.4u4u.4u.4u4444.44444444.44..4.4.4i..4.4i44i0;0O@@@@@@@@@@@@@&&;;1u.uu.... qq qq6$t6qqaqqqqqq .  ... .. . .... . ...... .  . ...... .. ..  .. . . . .               q  $r$r<<<<<<<>><<$rr$<$<<1<<<<<<<<<rrrrqa q qw a aw q a$ rq$r$<<rraqa waqaq q a a ww    www w    wa wq www. w  q w  w . . . ..  ..w         .          .      . . .  . . .     ..q u1;,@@@&@@@@;;@@p4..........u..u...........u.u.u.ui*w u4u4.",
-"...u.u............uu.uq.qq.uq.u.u. -qqqqqqqqqqq6$66666q ...u......u......u.u...uuuuuuuuuuuqu.u.uquuuuuuuuuuuuu.4u4uu4uu4.4.44i4.4.4.4.44.....4i4...4i444*@OO2@@;,@@@@@@@@@@&@&&;4..... .q qqa$$rr$$66q q- q . .. . . .    . .  .... . . . ....... .  .. .. . . . . .              aqr$<<<<<<<<<:<<<<<><<<<><<<<<:<<<rrr$rqaa#q   w wqwq$wq$q$arr>r<rqaqqw   qwq a w w w w w     w   w  w   ww  w q        .w. w..  ..     .          .   .       . . . . . .       ...w2;;,,@,@,,;;;;w.... ...................u.....u..42OXu.w..",
-"u.u....u..u.u.u.u....uqu.uq...qqq.uq-6--q6q-q66$$$>>>$-q..u.....u..uu.u.u..uu.u.uu.u.u.uuu.uu.uuuuuuuu.u.u.uu4u.uuu4u.4uu44.4.444444.4i44i4.4.4i.4i.4iiw;@2;90@@@@@@@@@@@@@@&@&;u.... .qqqq$$$r>$<$$6qqqqq    ... . .  .. .  . .....        .... . .   . . .  .  .               qqrr<><<<<><<><><<<<<<><<<::<:<<:<<r$rr$ra$arrqaqa wq  qrrrrrrr<<<$r qqq aa qwqwqw a w    w w w   wqwq q    w     q     w   .   .    .                              . . . .          .ap20;;2;;@;ww ......q.....u.u..............u..4u4*OOOO*u.",
-".. .uq. .............uuqqqu.qu.uuqq-6666$$$66>$>>>$>>>66-q.............u.u.u..uuuuuuuuuuu.uu.uuuuuuuuuuuu.uuuuuuuu4u4uuu44u4444.4.4..4i4.4.4.4..4i.iii42@;0000@@@@@@@@@@@@@&@&;i.... q qq6$>r<<>r>r6qqqqqq.. .    . . ..  . .. .....  . . ....  .. .  . .. . .. .. .            qar$<<<<<<<<><<<<<<<<<<<:<<::<<<:<<rrra$r$rr$rr r # wq aar$<$<r<<<<r$qqa  qw   w w q     w     q    w   w                   q    .   .  .            .  q       .. . . . . . .   ..... .qq.pwq.1*.q.. ....q uq.u...............u.uu.u.upOOOOOwqq",
-" uqqq qqqq...u...u..uqqq-q.qq...uqqq-6$>$6>>$>>>>>>>>>>$6q ...u.u...q.q.u.uu.u..uuu.u.u.uuu.uuu.uu.uuuuuuuuuuuuuuuuu.4.44.4.4.444.4.4.4.4...4.4...4i4i4*@;0;0@@@@&@@@;@@&&&@;2.u.... qq6$$>r><$<>r$6qq uq.  . .... . .  .. .  .... . .    . ....   . . ..  . . .  .            a r$<><<<<<<<<<<><<<<<<<:<<:<<<:<<<$rrr$r<<<<<raa a a awq$r<<<<<<<<<r$ a qa a awqw w wqwqw   wqw w a a a q w w                          .      .. .                   . . . . .     ..   qqqu1a....r q .......q...u..u......u........uu.2OOOO.6q-",
-"qqqqqqq6qqq ....q.q..uqqqqqqqq.q uq.qq6$>6>$>>>>>>>>>>6>$6q.......quqq.q........uquuuuuu.uuuquu.uuuuu.u.uu.uuuuuuuuuuu4..uu444.44.4.i4.4..i4.4.4.4.i4i4X@80;@@&@@@&@;0@0ppwXuu....  qq6$><r>r><><>$qq  q.q. .    . . ..  . ...  .. ...... ........ ...  ..... .w. ...           qr$<<<<<<<<<><<<<<<><<<<><<<<<<<rrr$a$r<<<<<<rrar w wq  $r<><<<<:<>rrq q  w w    w       w    q q      w q          a                   .      . ..   .q.    .    .. . . . . . . q .... qqq.a#u..u1a. ......u.................u.u.u....uwOOp-666",
-"qqqq666q66qqq..q..quq.qq6-qqqqqqqquqqqq6$>6>>>>>>>>>>>>>>>-q ...qqqqq6-q.q.qquq... uqu.uuu.u.uuuu.uuuuuuuuu..uu.uuuu.uu4.4.4.44.4444..4..4..4.4.i.i4ii4O@02@@@&&&&&@@&004uqu.....  qq$$>$<>><><><>$q qq .. . .... . .  ..      .... .    . .............  .. w . .w .    .     a$r><<<<<<<<<<<><><<<<<><<:<<<<<rrrarrr><<<<<<r$rqa w #aqa$r<<<<<:<<<rrrw qaqa awqwqwa a a w w w w a a w w a w          w. .          .           .           .     . . .     . .   .  .. . qup;*122 u.....q........u...u..u..u.....uwOoopOo-6$$6",
-"$666q66$6666qqqqq... qqq666666-6-qqqqqqq666>$>>>>>>>>>>>>$66qq qqqqq6$6qqq-q6qq-qqquq.uuu.uuuuuuuuuuu.u.uuuu.u.uuu.4uu4uu44444i44...i.444.4u....4.4iii4,802@@0@@@@&@;@&04......  qq6$$>>>>>>>><>>>r6q q qq . .    . . ..   ....... ...... .......... .    .   . . ..    .      qa$r<<<<<<<<<<<<<<<<<<<<<<<<r<rrrraqwqr$<<1<<rrraar w a  qa$r<<<<<<<<>rrqq  w w  w w w   w w w          w     q         . w   .    . . .   q .  ...       .     .... . . . q. . . . . .  ..q q.2;;9; .. ..q.......u..........uu.uu.u4*O29wpq6>6r6",
-"rrrrrr$r6t66qqqqq.qq.q q-$$>$$$66--6-qqqq-$$>>>>>>>>>>>>>>>>6qqq6-q66>$6--666666qqqqqququuu.q.uquuuu.uuuu...u.u.uuuuuuuu4.4...4.4.4i........4.4..iiii4X,80;@00@@@@@;4**a........ q6$$<<<<<<><>>><<>$qq    .  .   . . .  .  .      . ..   ..........   ..  . . . . .           w $r<><<<<<<<<<<<><<<<<><e<<<rrrrraa#ar$$r$rrrrrqa q wqwqw rarr<<<<<<<<<$ra q a a a a a a a a a w w w w  w   q  w          . .    .     w .     .                    . . .  .  . . . .q  ..   ..p;9;*uq q q.qq.............u.u..u..4400O;166$$6>$$",
-"6$6$6$6$$$r6666qqq.qqqq6$$>6>>>>>>$$6--qqq66>>>>>>>>>>>>>>>>>666$$6$$6>>666$6$>666-qqqququuu.u...q.u.u.u.u.u.uuuuuuuuuu44..u4..44.i4.i4..4i4...4..4.i4w;*0;@00&&;@@;p14........ qq$$>$>>>><><><>><$$qq  .q   ..  . . .. .. ...... ................ ..  .  .. . . . ...         qqr<<<<<<<<<<<<<<<<<<<<<<e<<<rrrar a rqrrrq$arrqraw  w wq aqar$rr<<<<<<<rqwa   w  wqw        w      w      w            .w              w.           .  .        .. . . . . . . . . . .  .    .w2;O1.q qqqqqqq...............u..44r0;,2q6$$>>$6$t",
-"$6>6>6>6>6>$>6$66-qqq 6$$>><>$>>>>>>>>$6666$$>>>>>>>>>>>>>>>>>>>>>>>>>>>>><>>>6>>66-q qquq.uuquuu.uu.uuuu.u.uuu4.uuuuuu.uu...u...44....i.....4...i.ii422p0,@;0@0;@@@22u........qq$$><<<<<<><><><>><$6q q            .  .  .    .......    .....  ..   .   .    .  . .          wqr><<<<<<<<<<<<<<><<<><<<<<<<rr aaqwqwa aqaqqwq   wa a w  a arrrrr<<<<<rrqwqa qwqw w aa a a qw w w    w w  q       .    .                            .           . .   .    . . .   q .   . . . p..qqqq66qqqqq.u......u...u.u.4#10,O*p6$$6$6>>>$",
-"6r$>$>$>6$>6$>>>$$6qqq6>>>>>>>>>>>>>>>>66>$>>>>>$>>>>>>>>>>>>>>>>>>>>>>>6>$6>6>>6>>$66qqqqquu.uuquuu.u.u.u.uu.uuu.uuuuuu..u.u...u......4..i.4..i4..ii.*X0;@@@@@;@;12wu........qqq$><>>>>>><><><>>>><6qq .    .  .  .. .. .. ....  ....... .       ..  . .. .   . .. .   ..     qa$><<<<<<<<<<<<<><<><<<<<<<<r$aar #a q aq q q qwawq w w a    aqa$rrrr<<rra$a  w w   wqw     w        w          q           .   ..         .     . .   ...  ..  .. . . .   . . . . . .   . q .  uq  q6$>$6q.q.......u........4*0;O,*66$>6>>$>6$6",
-"$>>6>6>6>>6>>>>>>6$$6$>>><>><>>>>>>>>>>>>>>>>>>$>>>>>>>>>>>>>>>>>>>>>>>>>>6>>>>6>>>6>66-qqququuuuu.u.uu.uuuu.u.uuuuuuuuu.u....u...........4....u.....i**0;@@0&@@@;0$4.......q q66$><><<<<><><><><><>$qqqq             . .  .     .  .     . ..    .              .  .         q r$<<<<<<<<<<<<<><<<<<><<><<<<rqwqwa aw$w w a awq  w a a  wwq qa rqrr<<rrrrqw  qwq w q   a a q w w w w  w   a  a wq                      .           .  .        . .    .   . . .   q  q.  q....    qq6$>>$qqq.qu.......u.u.uu*;OO,;r6$>>>$>>6>>>",
-"6>>>$>>>$>>$>>>>>>6>$6>>>>>>><><>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>6>>>>>>>>>>6>>>6>>>>>$66qqq.q.uuuuu.u.u.uu4.u.u.u.uuuuuuu.u.u.u...................4.42220;@0@@@0;;.u.......qqq$$>><>$>>>>><>><><><<>$qq     .       . . . ....  .. ..... .    .    ..    ..    . . ..    .  a$qrr<><<<<<<><<<<<<><<><<<<<><<rrq   w   $ q q qw w  w w a qw w  aqarrr><<<<raaw     w w     w            w   a  q qq                . . .          .    .      . . .... . . . . .    .   ..  ...  qq q6>>>>6qqqquu..u........w;OO2;16>6>6$6>>$6$>",
-">$>$>$>$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>$>>>>>>>>>6>>>>>>>>>>>>>>>>>6>>>6>>>6>6>>>6$6qqqq.qu...uu.u.u.u.u..uuuuuuuu.......qq-qq ..i.i....i....4w2w0;;;;;;@;iu.... qq qq6$6$$>$<<<<<><><>><><><>$qqq . . .      . ....    ..  .    .                        . .   .     qa$r><<<<<<<<<<<<<<<<<<<<<><:<<<<$aqw a rw #w#awa a a qwqw w wq w   qarrr<r<rr$ aqw w     w w  w w w w w w   a  qwqwq                 .                           . .   .   . . . .   q q q ..q   .  qq6>><>>>66qqqq.........q...121<6>6>>>>>$>>>>>",
-">>$>>>$>>>>>>><>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>6>>6>>>>>6>$>6-qq.-..u.uu.u.u..u.4u.uuuuuuuu..u.u...q6qqq....u...u......;;002;;@@0@a44....qqqqq66$$<><<$>>>>>><>><<<><<>$$q .. . .    ... .... ....  .. .... .       .... .        . . .        qar<<<><<<<<<<<<<<<<<><<><<<<<<<<r$w qw w  a a    w w  w w a a    wqr qrrrr$raqa       w w                     wqq                       .       .    . .q.q q   .. . ... . . . . .          q.qqqqqqq6$>>>>>>>6qqqqqu....qqqqqq-pr66$6>$>>>>>>>>>>",
-">>>>$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>6>6>6>>66>6>6>>>6>$666qq.q.uu.u.u.uu.uuu.u.uuuuuu..u4..uqq666qqq ....q..  qup*280;0;;@00011. qqqq6$$$<>>r$<$<<<<<><>><>><<><<>$q   .  ...  .  ..... .   ..  .    .      . .   w         .   .   .   aar$<<><<<<<<<<<<<<<<><<<<<><:<<<<$ra w  a a w wawa a a  a a w wa a a q#qaarawq# w w w w    w www w w w       qaq q q                                                          . . . .       q  q qqqq6>>><><>>>>>qqq.q...qqqqqqq6->>>>>>>>>>>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>6>>>>>>>>>>>6>>>>>6>>>>>>>>>6>6>>6>>>>6>>>>>>$6qqqq...uu..u..u.4u.uuuuuuuu.u..u..uq-6666qqqq qqqqqqqquX07;2,;,@@@9::.qqq6$$>>>>r$<>r>>>$><><><><>><<><>$qq . ..  .. ..    ... ..  .. ..... .     . .             ..         qr$<><<<<<<<<<<<<<<<<<<<><<><<><><<<rra$w w w a    w w wa  w w   w w w  w wq w  qwq       w    w                q q                                             q q q      q q  q q q.         qqqqq6$$>>>>>>><>>>>>6qqq q.qq-6q6q6>$6>6>>>>>>>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>6>>6>>>>6>>>6>>>6>6>>>$66-qqq.u4.u.4u.u.4uuuuuu.u..4u...u.qq666$66q-qq6qqq66-X,0800,,;@0@;1rqq6$$6><><$><>r><r<<r>r><><><>>><>r$qq. .. .   .  ... ....  ..  .      .           .                  qaa6r<<<>e<><<<<<<<><<<<><<><<<<<:<><<<rrarqa a   w a a a w  wqwqwa a a a  qw q aw w w w wa  w w  ww w w w               .                                                  q q q           .   qq6$$$>>>><><><>>>>>>>>$q-qqqqqq6-6$$6>>>>>>>>>>>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><>>>>>>>>>>>>>>>>>>>>>>>>>>>6>>>>>>6>6>>>6>>6>6>>>6>>>6>>>>>6>>>6qq ...u..u..4uu.u.uuuu..u.4.4.u..qq6$6$$$6-666q6$66p;;80,;,;0@@*-6$$$$$>r$$>$<>r><r<>$>r><>><>r><<<<<6$q q . . ... ..  ..... ..  .. .... .      . .   .  . .           qaa$r<<<<<<><<<<<<><<<<><<><<<<><:<<<<<<r<rrrra wa  a w  w a  qw  w  w w w aww ww  a      q w a   w a q                     qqq   qqq                    q                   q q q q       q qqqq6$$<><><><>>>>>><><><>>>$6qqqqqqqr6>>>>>>>>>>>>>>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><>>>>>>>>>>>>>><><>>>>>>>>>>>>>>>>>>>>6>>6>>>>6>>>6>>>6>>>>>6>$6qq ..uu..u.u4.u4uuuuuuu.......4..qq66$6$$6$$66$r$6r;;70;@@;0@;t>$><<>>r>><$>>r>r><$<r<>r><<><><><><>$$q q  . .   . . . .   .  ..  .                 . ..            qqa$r$<<<><<><<<<<<<<><<><<><<><:<:<e::<<<<><<rr$rraa w q  a   aw awqwa a a  w qwq a w w w ww w w w w w w      a a           q  qqqq                    .                       q q qqqqq    qqqq$<<>><<>>>e>>><><e>e>>>>>>>>6qqqqqqr6>6>>>>>>>>>>>>>>>>>>",
-">>>>>>>>6>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><>>>>>>>>>>>>>>>>>>>6>>>>>>>>>>>>>>><>>>>>>6>>>6>>>>>>>>6>>6-q..uu.u4.uu..u.uu.u.uu.u..u..u..q66$$>$>>>>>>>>$6*080,;;;@1r$>>$>>$>>>$>>$>>$<$<<$<$<><$>>><$<<<><$raq   . ... . . . ... ..  .. ...     ..    ..     . .           $ar$r><><<><><<><<<<<><<<><<><<<<<:<<:<:e<<<<<<<<rrrqq aqw  w w w                  a        w      w w           a    q qqqqaaaaqqqqqqqqqqqq q q     q    qqqqqqqq q q q q q q     q q qqqq qqq$r>><<>><<e>>>>>>><><e>>>>>>>>$-q-qqq6>>>>>>>>>>>>>>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><><>>>>>><>>>>>>><><>>>>>>>>>>>>6>6>>>>6>>>6>>6>>6>>>>>>>>>>>>>>>>$>6-qq..u.uu.4uuuuuuu.u..u.u......uq6666$>$>6>$>>6>6*00;,,;006>>$$>><>>$>1r1<$<>><>$<$<<<><<<>><<<><><$taq   . .  . ..     .  ..  .     .         .            .   wqqq$r><<<<><<:<:<<<<<e<e<e<e>:<<>e<:<::<:<:<<<:<<<<$rrrrar#qaqwqa w awawaw w w awawaw#qwaw w  wwww w w w w    a  a   qaqaar$rr$$$$rr6rt$$$$$r6$6r6qqqqaaqqqqqqqqqqqqqqqqqqqqqqq qqqqq qaq q qqq6$>>><><><>>e<>>>>>>>e><>><>>>>>$6q-q-6$6>>>>>>>>>>>>>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><>>>>>>>>>>>>>>>>>>>>>>>>6>>>6>>>>>>>>>>>>6>6>>6>6>666qqu.uuuu.uuuuu.4.u4uu.u.u4...u.qq666>>>$>>>>>$>>a20&,;@@01->>>>$>>>>r222<$>$$<$<$<><><<>><>><><><<r$r6a    .   .   ..... .. . . .  .         ..  .       ..  qqqaar$<<<<<><<<>:<><><<><e><e>:<><<<<e<:<:::<e:::::<<<<rrr$r$rrwqa  wqw          w       w    w wpp#           w   w aaa$trr<<<<<<<<<>r>><>><><$<<>r>><rr$rr$r$rtr$r$$$$$$r$$$r66q6qqqqaq6$6$$6$>>>><e><><e>e<>>>>>>>>>>e><>>>>>>66qqqq66>>>>>>>>>>>>>>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><>>>>>>>>>>>>>>>>><>>>>>>>>>>>>>>>>>>>>>>>>6>>>>>>>>>>>>>>>>>>>>>>>>>6-qquuuu..u.uu..u.uu..u.4....u..qq-6$>$>>6>>6>6>6rw;0;;;;;2>6>$>><>>$<<r$>r><><>$<>r>><><<>><><<<>><<$rqqa     . ...     .  . . ..   .        .   .           qaa$$<><<<<><<<><:e<e<e<:e<<:>:<<<<><<<:<:<:<e<:<:<:<:<<<<<<rrrrrrqr qw awaw w w wqwawawqwqw   q  www   w w w w  qwaqar$rrr<<<<<<<<><><><><><><><><>><>><>e><<><<$><><><<<<><<<><>>$>>>>>>$><<><>>><<e<><><><>>>>>>>>>>>><>e>>e>>>66q-qqq$>6<>>>>>>>>>>>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><>>>>>>>>>>>>>>>>>6>>>>>>>>>>>6>>6>>>>>>>>>6>>>6>>66-qq..u.u.u.uuuu.u.u4.u.uu...u.uqq-$6$>6>>>>>$6>6r200;2;@@p->>$>$<>>>>>><><>$<r><><>>><>>>>>>>><><<>$$r$qqqq   .  ....   .    .  .            ..     . . .q qa$r$<><<e>e<<><<<e<e>e<e<>e<<<<:<<><<>:<:<:<:<:<e<:<:::<<<<<<<<<r$r$$ q    a q q q  q  w # a   qa  wqw        aw qqrarrr<<<<<<<<<e>e>e>e>e>e>e>e>e><e<<e<e<<><<>e<<<><<><>:e:><<><<>>><><<<><e<>>e>>>>>e<e<e>e>>>>>>>>>e>ee>e>e>>>>6qq-q-6>><>>>>>>>>>>>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>6>>>>>>>>>>>>>>6>>>>>>6>>66-qu.uu4uu.u.uuu.u..u.u.u.u.....qq-66$66>$>6>>$>6a;0;22;@0116>>$><>>$>>r><>>$<>><><<>>>><><><><>>><<>$>$r$qqq             q q             .            qqaqa$r$<><<><e<><<<><<:<:<<><:<:e><<:<<><<<:<::::<::<e::<:<::<<::<<<<rrrr$wq#a w # # w w q a q w     qq w a w   aq qaqar$r<><<<<<<<:<:<><><><e<e<><><><e<e>e>e>e:ee><>><>>><>><>><>>:<e:eee><>e<e<eee>ee<e<>e<e<>>e>>>>>>e>>><>>e>>>>>>-q-qq6>>>>>>>>>>>>>>>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>6>>>>>>6>>>>>>>>>6>>>>66>6>>>>6666-qu.uu4u.u.u.u.uu.u4u.4.4.u.u..q-$6-66>>$>6>$>>6a*2;;;;001<>>>>>>>$<>>$>r>>$>>>>>>>><>>>>>>>><<><><<>$r6qaqqq qaqqaqaaqqqqq qq q          .        aqaq$$<$<><<><>e<<<><<><<e<><<<><<<<<<<><<e<:<::<:<::<:<:<:<::<::<:::<<<rr$aqwqqr qqq q  $ qwq qwwq aqa wqqqq q aqqqqa$arr<<<<><<><<<<e:<e>:>:e:<e>eee<ee><><><e<e>><>>e>e>ee>e<>>>>><>>:><>e>e:<:<e:>:<e<>e>>>>>>e>>>e>>>>>>>e>>>e<<>>>>6qqq-6>>>>>>>>>>>>>>>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>6>6>>>>>>>>6>>>>>>>>>>>>6>6>66-6qqu.u..uuuuu.u..u4..u.4......q.qq-6666$6>>6>6>>>6aa;;21rrr$r>$>>>>>$<><>$r><><><>><>><><><><>><><>><$><<$$6aqqqqaqqa6q6qq6qqqqqqqqqq     qqq qaqaqq$$$>r<<<<><<<<:<<><<><<>:<<<><<<<><><<<<e<<::<::<:<::::<:::<:::<::<:::<<rrrrqra qw w # qwq $ a wq #q  q qw$a raq aar$r><><:<<<<>:<<<:<:><<<<e><e<e><e>e><e<e<e<:>>eee<<><e>><>>e<eeeeee<ee>:>e>e>>>e>e>e>e>>e>e>e><e<>>>>>e>e>>>e>>>>>>>6-q-66>>>>>>>>>>>>>>>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>6>>>>>>>>>6>6>>6>6>>>>>>>>66-qq..uu.u.u.uu4..uu..u.u4.u....uqqq66666$>>>>>>>>>>66<>>6><$><>>>$>>$>>>>>><>>>><>>>>>>>>>><><><><><<>><>>$$$$$r$rr$r$r>$$$rr$$$6qqq6qqqqaqaaq6q$rrr>r<><<<<<<><><<><><<<<<<><<<<<><<<<><:<<<:<<:<::<:<:<::<:<:<::::<:<:<:<<<rrr$r$q$q$qqwqr q q rq#qq aq q$q$aara$a$r$<><<::<:<::<::><e<eee>e><<<e<ee<e<><><><><><<<e<e:e<><<<e<<><><>>>e>>>>>>e>e>e>e>e>>>:>>>>>>>e>>e>e>e>>>>>ee<eee>>>>6qqq6>>>>>>>>>>>>>>>>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>6>>6>>>>>>>>>>>>6>6>6>6>>666-q..uuuuuuuu.u.4uu.u.4....uq.qqqqqq6$66>6>6>>>$>>>>>>>>>$>$>>$>>$>>>>>>>$><><>>><>><><><>><><><><>><<><<<<<<<$<><<<<>r<<<><<r>r$>$$r$$r$>$$$$$rr$<<<<<<<<><<<<<><<<<<<<<<<<<><<<<<><<<<<<e<:<:<::<:::::<::<::::<:::::<::<<<<>rr$rrrawr q  $ a#aaa$awr a$q$$r$rr$r<<><<<<<<:e<e<e:<:<><:><e<<ee<<>e<>e<e<e<e<e<>e:e><><<:>e>e><ee<><><<<<e>e>e>>:>:e>:>:>e>>>e>e>e:<e><>>>><e<e<>>e>e>>>>>$66q66>6>>>>>>>>>>>>>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>6>>>>6>>6>>>>>>>>>>>$66-qquuuuuuuuu.uuu..4u..u.uq q-q--6666$$$>>>>>>>>>>>>>>>$>$>r>><<<>r>$>><><$><>><>><>>><><<><><><><<<><<<><>>>>><<<><>>>>><><><><>><>>><><<<<<<<><><><<<<<<<<<<<<<<><<<<<<<<><<<<><<<>:<:<<:<:<::<::<:<::<:::<:::<:<:<::<:e:<:<><r$r$r$qrqrq$$qrr$rr$qra$$rrr<$<<><<<<e:ee::::<::<:::::<e<e<>e<><e<>e<:<:<<><><e<><<:e><><e<e<e<<ee<e<><><>>e>e>e>e>>e>e>e>ee>e>>e>><<>>e>ee>>>>ee>e<e>>>>>$6-666>>>>>6>>>>>>>>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>6>>>>>>>>>>>>>>>>>>>>>>>>6>6>6>6$66-qqquuqqquu.uuuu.uu..u..qqq-666$6$>>>>>6>6>>>>>>>>>>>>>$><>>$<>>>>>>><>>>><>><>><>><><<>><><<<e<><<<>e><><<<<<<<><<><<<><><<><>><<$<<><><>><><>r<<><<<<><><<<><<<<<<><<<><<<<<<:<:<:<<<<:<:<:<<::<::::<::<::::::<:::<::<:<:<:<<<<<r$rr$r$rrrrr$rr$trr$r6<<<><<<<<<:e<:<:<e<e:<<e:<:<:>:<:<:<e<:<>e<e<e<>e<><e<ee:e<<:>:<:e<:<:<e<e<e<e:e:e>:>e>e>ee>e>e>:>>e>>e>>e<e>><>e><e<e>>e>e>>><>>>$666$$6>6>>6>>>>>>>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><>>>>>>>>>>>>>>>>>>>>>>>>><>>>>>>>>>>>>>>>>>>>6>>6>>>>>>6>>>>6>>>>>>>>>>>>>666---qqq.qqququuu...u..uqqq666$>>>6$6>>>>>>>$>>>>>>>>>$>>>$><>>>$<><><>><>><<>><>>>><>><<><><><><><><<><<<><><><><><>>><><><><e<<><<><<<<><<><><><><><<<<<<<<<<<><<<<<<<<<<><<><<><<<<:<<:<::<::<<:<:<::<:::<::::::<::<::<:::<:::<:<<<>r$r$rrr<<<>rrr$rr<><<::<<:e:<:::e::::::::<:::::<<<<<<:<e>e<e<<<:<:<>:<:>:<e<>e<><>e<e>e<:<<ee<e<<<e<<e<e<e<>e<e<e<e<e<>>ee<e<>e>e<>><>>e>><>>>ee>>>>>>>$6666>666>6>6>>>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>6>>>>>>>>>>>>>>>>>>>>>>>6>6>6>6>6>6>6>6666-qqqqqqqqquuu.u... q6$>>>6>$>>>>>>>>6>>>>>>>>>>>>>$><>$<$<>><$<><>><>>><>>><><<<<>><><><><><><><<><><><<<<<<<><<><><><><<<><<><<><><><<><<<><<<><><<<<<<><<<<<<<<<><<<><<><<<:<:<:e<e:<:<e<e<:<:<:::<:::::<:::<::<::<:<::<::<:<<<<<<e<<><<<<<<<<<><<<e<<:<<::e::::::::::::e:<:e<:<<<:<e><e>e<e:>e<e<<<e<e>:e<<:<:e<e>:<:>e<>e<e<e<:ee><e<e<e:<e<e<e<e<e:e>>e<e<>>>e<e>e>>e>e>e<>e>>>>>>>>>>$6666666>>6>>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>6>>>6>>6>>>>>>>>>>>>>>>>6>6$6-66-q-qqqu.u.uuuqq66>>>>>>>>>>6>>>>>>>>>>>>>>>>>>>>$>>>>>>$><><<>>>><>>>><>>r<<><<><><><><><><<><><<<<><><>><><><><><><>><<><<><><<<<><<><<<><><<<<<<<<<<<<><<<<><><<:><<><:<<<:<<<:<:<::<:<<<<:<:<:::::<::::::<::<::::::::::<:::::<::e:::::<:<::e:e<:::::::<:e<e::::e:::::::<:e::ee>e<e<e<e<e<:<:<:e<:>:ee<:<ee<e>:<e<e>e:<:e<e<e<><:<e<e:<><e<e<e<e<e><e>:><><<<e><><<>>>e<>>>>eee>>>>>6>>$66$666>>>>>>6>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>6>>>>>>>>>>>>>>>6>6>6>6>6>6>6>>>$>6>$666-qqqqq..qqq6$$>>>>>>>>>>>>>6>>>>>>>>>>>>>>>>>>>>$>><:>>>>><><>>><><>>>>><<><><><><><><<>><><><><<<<><><><><><><><><><<>><<<><><<<><<><<<<><<<<<<<<<<<<<<<<:<<<:<:::::<e:<:<::<::::<:<e:::<:::<:::<::<::::::<:<::<::<:::::<:<:<e:::::::e<:::<:::::::::::::::::::::::::::e<:<:><e<e<:>:>:<:<e<e><:ee<e<e<e<ee<<e>:e<e><e<ee<e>:<e<e<e<ee<e:e>ee>e>e<e>e><e<>>><>e>e>>>>e>>>>e>>e>>>>>>>>>>6666$666>6>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>6>>>>>>6>>>>>>>>>>>>>>>>>>>>>>>>>6>>>>6>>>>66-qqqqq-q6$>>>>>6>>>>>>>>>>>>>>>>>>>>>>>>>>><><1:>>>>><e>>>><>>>><>>><>><><><><><><>><<><<><><><>><><><><><><><><><><<<><><><><><><<<<><<><<><><<<<<<<:<<:<:<<:<:<<e::::::::::::::::::::::::::::::::::::<::::<:::<:<:<::::::::::::<<:::::e:e::::::::::::e::::e:::::::::e<e<e<e<::<e<e><e<e<e<e><e<e<<e<e<<e<e<e<e>e<e<<:>:<><><<><e<<e<><<><<><e<e<><><e<<><<><>>>>e>e>>>>>>>>>e>>>>>>>666-666666>6>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>6>>>>6>>>>>>>$>>6>>>>>>$6-q6666>6>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>66::0:111>><>><><>><<>><>><><><><><><<>><>><<<><<><><><><><><><><><<<<><<><<<><<<<<<><><><<><<<<<<::<<:<:<:<<:<<:<:::::::::::::::::::::::::::::::::::::::::::::<:::::::::::::::::::::::::::::::::e::::eee:eeee:eeee::::<::<e>e<e:<::<:<<e<e<e<e<:<e>e>e:<e<e<e<>:<e<e<e>e<e><e<e<e><e<e<e>e<e<e>e<e<:>:<<e<>>e>e><>>>e>>>>>>>>>>>ee>>>>>>>66-qq-666$$>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>6>>>>>>>>6>>>6>>>>>>>>>>>>>>>6$>6$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>$:<:$777700<>>>>><>>>>>><><><>><><><><><><>><><<>><><><><><><><><><><><<><><<$<><><><><<><<<<><><<e<:<:<<<:<:<:<:::::::::::::::::::::e:e:e::::::::e:e::::e::::::<:<::<::<:<:::::::::::::::::::::::::eee:eee::::e:::e:::::::::e<e:<<<<<:e<e<>e<<><<<<<<<<e<e<<><<><<><><<><<>e<e><<<>e<e<:<:>6><<<<<><<><><><><><><><<><e<e>>>>>>>>><><>>>>>>>>>$66q-qqq666>>",
-">>>>>><>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>e>>>>>>>>>>><>>>>>>>>>>>><>>>>>>>>>>>>>>>>>>>6>>6>>>>>>>>6>>>>>>>>>6>>>>6>>6>6>>>>>>>>>>>>>>>>>>>>>>>>>>>$>$>$$10777:1<<1<>>>>><>>>>>>>><><><><>e><><><><<><>><><><<><><><><><><><><><<<<><<<r><<<><<><r><<<<<<><<<<<<::<e<e<:<:<::<::::::::::::e:e::::::::::e:e:::::::::e:e::::::::<<<<::<::::::::::::::::ee:e:ee:::e:e:ee:ee:e:::e::::::e::<ee>:<:e<:<>><<:<<<<<<<<<<<<<<e<><><<<><<e>e<<><<<><<><<<><>::r<><<>e<e<:::::>:<><><>e>e>>>>>>>>>>>>>>>>>>>>>>>>>>666q-qqq6$6",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>e>>>>>>>>>>>>>>>>e>>>>>>>>>>>>>>>>>>>>>>>>6>>>>>>6>>6>>>>>>>>>>>>>>>6>>>>>>>>>>>>>>>>6>>>$>>$>$>$>-:5%7:::e>>>e<><>>>>>>>><>><><><><><e<><<>e><><><><><><<e<><><><><><><><><><<><><<>r><><<<><<><><:<<<:<:<:::<:<:::<::::::::::::::e::::e:::e:::e:::ee:e:e:::::::e:e<:<$<<<1<<$><::::::::e:::e:::e:ee:e:e:ee:e:ee:e::e:e::e::><<:<:<<<<$><<<<01-::-6-6$6><<<-6>:::::><<<<<>r<>$666-6<><<-----u0%1--6$<$<><::1e::::::<>><<><>e>e><>e>e>><>e<><>>>>>>>>>$66$66$>>",
-">>>>>>>>>>>>>>>>>>>>>>>e>>>>>>>>>>>>>>>>>>>>>e>>>>e>>>>>>>>e>e>ee>ee>>ee><><>>>>>e>e>e>e>>>e>>>>>>>>>>>>6>>>>>>>>>>>>>>6>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>$>>66-$:55887::e>e<e<ee><>>>>><>><>><><><><><><<><<e><><><e<e<e<<e<><><><><><><<<><<><><>><<<<<<><<<<<<e<<:<<<<:<::::<::::::::::::::<:::::::e:::e::e:e:::e::e::ee:e::e:::<<r175%%%%%71r><<::::e:<e::ee::e:ee:e:e:e::e::e:e::><<:>617$6666-><<11>>q<055%55770:116$1755%%77:::--6$>$-11::170-qqr:707777%777::::>--q-6tr<<e:::::e>>><>>>e>>>e>>>>>>>>><>>>>>>>>>>>>>6>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ee>e>>>>e>>>e>>>>ee>>>>ee>e>e>e>>ee>>>>>>>6>><>>>>>>>>6>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>6>$>$>$$::17+=7::::::<<:e:<:<e<><>>><><>>><><><>e>e<><e>><>e>e><<><><><><><<><><>><><><<><<<><r<<<<<<<><<<<<>:<:<<<:<:e<:::<:::::::::::::::<::::::::e:::::::ee::e:e::::<<<><<$:015y+yy+y++3701<<<<>>>>><<<::::e:e::eee:ee:e::e:::700077%+5707755%%%5%%7%+y+++++++++%55%yyy+++3%577755%553%%++++5777yy++y++y+yy+3%%55777:<$--6e::::::::>>e<><>>>>>e>><<<>>><>>><>>>>>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>e>>e>>>e>>>ee<><eee><eee>ee>e>e>ee>>>>>>>>>>>>6>>>>>6>>>>>>>>>>>>>>>e>e>e>>>>>>>>>>><>>>>>>>>$>$>>>66:717+%1:::::::eee>ee<e<>>>>>><>e<<><><><><<<>e<><>e<<<<<><e<><<><<<><<><e<e><><<><><><<<><<<><><<><::<<:<<<:<::<::<:::<:::::<::<::<::::::::e:::ee:<:e<:<::e::<>111007%05++%+yy++yy+++y%%%557777770:1:1::e:::::ee::<::1:7%%+++3+++yyyyyyyyy+yyy++++y+++y+++yyy++++yyyyyy+y++++yy+y++yyy++yy+yyyy+y+yyy++y+yy+y+++3%577:$--q6$r-><><>>>>>>>>>><>>>><>>>>>>>>>>>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>e>e>e>>e<>>eee<><ee>e>ee>ee>e>e>>ee>e>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>e>>>>>>>>>>>><>>>>>>$>6>6>---6rqu03%0::::::::e<:e<e<>e>e<>><<>:e<<e>e>e>e<<>e<e<>>e>e><><e<:<<><><><><<><><<><r<r><<<<<<<<<<<<:<<:::<::<<<<:::<::<:<::::<:<<:<<:::<:::::::e:1:<<11<:<::1e<<07%++++yy++y+y++yyyyy+yy+y++yyy+yy+++++3+7<::e:e:e:e<7%%+++yyy++++++y+yyyy++++y+++yy++++yyyy+yy++++yyyyyy++y+++++++++++++++++yy+yyy+yy+y+++++++++++yy++y3%57:::$:<--q-66><><e>>>>>><<>>>>>>>>>>>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>e>>>>>e<ee<eee>e>>e<eee>eeee>e>>ee>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>e>>>>>>>>>>>>>>>>>>>-6$>-:77:-:$0++3%%:::::::::<e:<:<:e><e<><><><><><<<><e<><<<><><><<<><<<>e<><<e><>><><><r<><><<><<<<<><<<><<:e<e<:<<<<<<<<<<<<<<<<<<<<<<<<<<<::<<<:<<<<<<<>0%371<<1<q05+yyyy+yyyyyyyyyyyyyyyyy+yyyyyyyyyyyyyy+y30:e:ee><:1:73y+yyyyyyyyyyyyyyyyyyyyyyy++yyy+++yyy+++++yyyyy++++yyyyy+++yy++++++++++yyyyyyy++yyyyy+++++++++++++y+++++3%%+5777771$--66<><><>>>>>>>>>>>>>>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>e>>e<e>ee:e<e>e>eeeee<e:<e>ee>eee<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><>e>>>>>>>>>>>>>>>>$::66::%35::%%+++33%7:e<e::e::<e<e<:<<e><e<>e><<<>e>e><:<e<e<e<e<e<>e>e>e<><<<><><<<<><<><r<$$r<<<<r><<<><:<<:<:<<<><<$tr<t$<<<r66r1r<<rr666r$r$66r<<1101753+y+375717%yy++yyyyyyyyyyyyyyyyyyy++yyyyyyyyyyyyy++35::::1777%%+y+++yyyyyyyyyyyyyyyyyyyyyyy++yyyyyyyyy+++yyyyyyyyyyyyyyyyy++++++++++++++yyyy+++yyyyyy+y+3+++yy+++++++++++++yy++++++%%571<-------6$>>>>>>>>>6>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>e>>><>eee>ee:eee>e>e<:ee>e>e:>ee><>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>e>e>>>e>>e>>>>>>>>>>>>>$>11$-q1753%05++++33+57:e::e:<e:>:<:<ee<<><>:<<<><<><<<:><<<<><<<><><<<><<>e>e><><><<><<<<<6->1<-<<6<:$$611><<>1rr11111080570110557785%%5577010100755%%+++yyyyyyyy++3yy+yy++yyyyyyyyyyyyyyyyyyy+yyyyyyyyyyyyyy%%5::::5+yyyyyyy++++yyyyyyyyyyyyyyy++++yy++yyyyyyyyy+++yyyyy+yyyyyyy++yy++++++++++++++++yy++yyyyyyy+y+333++++++++yyyyyy++++y++++yy+++%%5757777:u--6>$>>$>$>>>>><",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><>>>>>>>>>>>>>e>e><e>e:ee<e<e>e>ee:eeee<e:e>ee>e<e>>><>>>>>>>>>------>->>>>>>>ee><<>>><>>>>>>>>>>>6<:<:::177%%+513+++3333%7:>:::::::>e<:<<>eee<e>e<<><:<:e<:><:<:ee:<:<e<e<ee<<<><<<<<><<>r6-q17%%%1qr157111001<q1558%%3+3y+yyyy%%++yyyyy+yy+y+y+++yy++y+yyyyy+yy+++yyyyy++yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy%7::7%+y++y++yyyyyyyyyyyyyyyyyyyyyyyyyyy+yyyyyyyyyyyy+yyyyyyyyyyyyyyyyy++++++++yyyy++++yy++yyyyyyy+++33333++++++yyyyyy++yyyyy+++y++yyyy+yyy++%771:$>6>>$6>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><>e<e<>:>e<e>e>e<ee<e<e>>>e><><>><>>>><><>>>>6q170:00:01<><>>>>>>>>><>><>>>>>>>>-->$a17%577%%++%17++++++%%7:<:<:::>:::ee>e:><>:<e>e><<<e<<e<<<<<e<<>e<e<e<e<<e<><<<<<$6-q-$:017++++%50%y=%33%%%57%3y++yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy+y++yyy+yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy57:773+yy+yyyyyyyyyyyyy++yyyyyyyyyyyyyyyy+y++yyyyyyyyy+yyyyyyyyyyyyyyyyy++++++++yyyy++++++yyyyyyyyy++++3++3++++++++++++++yyyyyyyyyyyyyyyy+y++++++376>>>>>>>>>>>>",
-">>>>>>>>>>>>><><>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><>>>>>>>>>><>><>e><>e><>->>>>>>>><>e>e>e<e<e>e><>-$><<>>$<$6::1108855701-----$:6>:>->-6>>$><$--:016$<1<17777501$0+++++++%5::::::e:::<:<:<:<ee<e<:>:<e:<:<<<<<>e<>e<<<><<><ee<<<<<<<q$1::75%3%+++++++++++yy+yy+yyyyyyyyyyyy+yyyyyyyyyyyyyyyyyyyyyyyyyyyyy+y+++y++y++yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy%%%++++yy+yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy+yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy++++yyyyyyyyyyyyy++3+++++++++yyyyyyyyyyyyyyyyyyyyyy+++++++y816$>$>>>>>>>>>",
-">>>>>>>>>>>><>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><>>>>>6-6-17:>$-6>>>$---->----6-6--:7:$-------u187777%3%%%757775775%%7777:$>>-u-:7771$:57177:::075%++++++++%77:::::::::::e:e::>:<::<:<e<<::<<::::<<<<><<<<<<<<<><>$<$-17%3++++++y+++++++y++++y++yyyyyyy+y+y+y++yyyyyyyyyyyyyyyyyyyyyyyyy++yy+y+y+y++y+yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy+++yyyyy+yyyyyyyyyyy++yyyyyyyyyyyyyyyyyyyyy+yyyyyyy++yyyyyyyyyyyyyyyyyyyyyyyyyy++++yy++++++++yyyyyyyyy+3+y++++++++yyyyyyyyyyyyyyyyy+yyyyyyy3%8%016><>>>$>>>>>>>",
-">>>>>>>>>>>>>><>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>6----666>-::::08%%%705%5577:::7::7:::::5+%57:77770000%%%%++++yyyy+++yyyyyy+++3%%%5773+55%575%%%33+++++y++++++3351<::::e::::::::::e:::e:e::<::<:e:<<e<:<:<:<<<<<<<<<<$<:q17%++++++++++++++++++++++yyyyyyyyy+yyy+yyy+yyyyyyyyyyyyyyyyyyyyyyyyy++y+y+y+y+y++yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy+++yyyyyyyyyyyyyyy+++++y+yy++yyyyyyyyyyyyyyyyyy++yyy%801t1a<$>>$>>>$>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>$6----u--$<:0701:77:%++++3+++y+++++y++++++++++++++++++y+yyy+++++++++++++++++++++++++++++yyyy++++yyyyy++++y+++++3++++333%%0-$<><:::::::::::::e::::<e:e<e:<:<:<<<<<<<<<<<<<<<$-$7%%585+3+++++++y+++++++++++++++yyyyyy+yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy+y+y+y+y++y++yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy+yyy+yyyyyyyyyyyyyyyyyyy++yyyyyyyyyyy+++yyyyyyyyyyyyyyyyyyyyy++yyyyyyyyyyyyyyyyyyyyy+yyyyyyyyy++++yyyy++++++++yy++yyyyy+yy+3%801q6$>6>$>>$>>>$>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>6$6-66$--><:::175%5%++++++333++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++333%%%57::>>>>ee::::::::::::::::::<::e:<:<:e<<<<<<<<$$r::0557%3%3+++++++++++++++++++++++y+y+yyyy+yyyyyyy+yyyyyyy+yyyyyyyyyyyyyyyyyyyy+y+y+y++y+y+yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy+++yyyyyyyyyyyyyyyyyyyyy++yyyyyyyyyyyyyyyyyyyyy+yyyyyyyyy++++yyyyyy++yyyyy+++yyyyyyyyy%16u->><>>>>>>>>$>>>>>>>>>",
-">>>>>>>$>>>>>>>>>>>>>>>>>>>>>>>>$>>>>6-<::::775%%+++++yyyy++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++3333%%%%%%%%555777::::>><e::::::::::::::e:<::<<e<<<<<$6-<<10%3+333%+++++++++++++++++++++++++y+y+y+y++y++yyy++yyyyyyyyy+yyyyyyyyyyyyyyyyyy+y+y+y+y++y+y+yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy++yyyyy+++++++yyyyyyyyyyyyyyyyyyyyy++++yyyyyy++++yyy+yyyyy+yyyyyyy++++++yyyyyy++yyyy++++yyyyyy++++0-<><$>$>>>$>>$>>$>$>>>>>",
-"><>>>>><><><>>>>>>>><>>>$6>>-->-----u:700000%++yy+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++3%%%%%%%5%55555555555%%5557777::><e::::::::e<:<e<<<e<<>6-$<:07%%%++++++++++++++++++++++++++++++++++++y+y++++y+yyyyyyyyyyyyyyy+++++yyyyyyyyyyyyyy+y+y+y+y++y+yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy+yyyyyyyyyyyyyyyyyyyyyyyyy++yyyyyyyyyyyyyyy+yyyyyyyyyyyyyy+++++yyyyyy++yyyy+++y++yyyyyy+y0u6rr$$6$$><$>>>$>>>$><><",
-">>><><>>>>6---------u---$$1575%557::77075575%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%%5%555%5%5%%55%55555%55%%5555557:::>>>$>6>>>>>>><>>$r:775%3++yyy+++++++++++++++++++++++++++++y+++++y+++++++++yyyyyyyyyyyyyy++y+y+y+y+yyyyyyyyy+y+y+y+y++y+y++y+yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy+yyyyyyy+yyyyyyyyyyyyyyyyyyyyyyy++yyyyyyyyy+++++yy++yyyyyy+++++++++++++++yy++yy++yyyyyy++37<-u17:::->>>$>>$>>>>>>>",
-"><>>>$--><:0777777777755%%%+++yyyy+++3%3+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%%%5%%%5%5%5555555%5555555555%%%5557777777755%55%555%3yy++++++++++++++++++++++++++y++++++++++++++++++y+y+y+y+yyyyyyyyyyyyyyy+yyyy++yyyyyyyyyyyyyyyyyy++y+y++y++yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy+++yyyy++++++++yyyyyyyyyyyyyyy+++%5550<1<<>------>$>$><>",
-"---6<1075%++++++++yyyyy++yy++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%%%333%%5%5%%%55555%55555555%%333++yyyyy+++++yyyyyyy+++++++++++++++++++++++++++++++y+++++++y3+++++++++y+y+y+yyyyyyyyyyyyyyyyyyyy+y+yyyyyyyyyyyyyyyyy+y++y+y++y++yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy+yyyyy+++yyyyy+++yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy+++yyyyy++++++++yyyyyyyyyyyyyyy++++++++%%%%555770:<$-----",
-"0775%3y+yyy+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++3333%%%%%5%555%%%%%%%5%5%%5%%3++++++++++++++++++++++++++++++++++++++++++++++++++++++3+++++++++++++++++++y+yy++yyyyyyyyyyyyyyyyyyy++yyyyyyyyyyyyyyyyyyy+y++y+y++y+y+yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy+yyyyy+++yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy+++yyyyy++++++++yyyyyyyyyyyyyyy+++++++++++yy+++yy3%%7701:",
-"y+yy+y++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++3%%%%%5%%%%%%3%%33+3%5%%%%%%%%%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++yyy++yyyyyyyyyyyy+y++++yyyyyyyyyyyyyy+y++y+y++y+y+yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy+yyyyyyyyyyyyyyyyyyyyyyyyyyyy+yyy+++yyy+++yyyyyyyyyyyyyyyyyyy+yyyy++yyyyyy+yyy+yyy++++++++++++++++++yy++++yy++++yyy+++++++y+++++++++y+yyyy++y",
-"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++3+++++++++++++++++++++++++++++++++++++++++++++++++++33%%%%%%%%%%%%%%%%%%3++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++y++y+y+++y+++y+yyyyyyyyyyyyyyyyyy+y+yyyyyyyyyyyy+y+yyy+y+y+yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy+yyyyyyyyyyyyyyyyyyyyyyyy++yyyyyyyyyy+yyyyy++++++yy++++++++yy++++yy++yyyyy+++++++yyy+++++++++++++y++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++33%%%%%%%%%%++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++y++++++++++++y++y+y+++y+y+y+yyyyyyyyyyyyyyyyy++yyyyyyyyyyyyy++yyyy++y+yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy++++yyyyyyyyyyyyyyyyyyyyy+yyy++yyyy++yyyyyyyyyyyyyyy+++yyyyyyy+++yyy++++++yy++++++++++++++++++yyy+++++++++yyy++++++++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++y+yy++++y++++++++++++++++++++++++++++++++++++++++++++++++++++++++++yyy+++++y+++++y+++y+++++++++++++y++++++yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy++++yyyyyyyyyyyyyyy+yyyyy+yyy++yyyy++yyyyyyyyyyyyyyy+++yyyyyyy+++yyy++++++yy++++++++++++++++++yyy+++++++++yyy++++++++++++++++",
-"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++yy++++++++++++y+++++++y+++++y++++++++yy++++y+yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy++yyyyyy++yy++yyyyyyyyy++++yy+++yyy++yyyyyyyyyyyyyyyyyyyyyyyyyyy+yyyyyyyyy+yyy++yy++++++++yy++++++yyy+yyy+++++++++++++yyy++++++++++",
-"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++yy++++++++++++++++++++++++++y++++++++yy++++++yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy++yyyyyy++yy++yyyyyyyyy++++yy+++yyy++yyyyyyyyyyyyyyyyyyyyyyyyyyy+yyyyyyyyy+yyy++yy++++++++yy++++++yyy+yyy+++++++++++++yyy++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++yyyy++++++++++++++++++yy++++yy++++yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy++yyyyyyyyyyyy++++yyyyyyy+++yyyyy+++yyyyy++++++yyyyyyyyyyyyyyy+yyyyy+++++yyyyy++++++++++++++++yy+++++++++++++++++++++++++++++++++yy++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++yyyy++++++++++++++++++yy++++yy++++yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy++yyyyyyyyyyyy++++yyyyyyy+++yyyyy+++yyyyy++++++yyyyyyyyyyyyyyy+yyyyy+++++yyyyy++++++++++++++++yy+++++++++++++++++++++++++++++++++yy++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++yyyyy+yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy+yyy++++++yyyy++++++++++yy++++++++++++++++yyy++++++++++++++++++++++++++++yyy+yyy++++++++++++++++++++++++yyyy++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++yyyyy+yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy+yyy++++++yyyy++++++++++yy++++++++++++++++yyy++++++++++++++++++++++++++++yyy+yyy++++++++++++++++++++++++yyyy++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
+"````````````````````````]]]`````]``````]````]]]]````````````````````````````````````````]]``````````````````````````````````````]]]]]]]]]]''']]'']]]]]]]`]]]``]']]]]]]]]]]]``]'']]]]```````````````]]```'']]]]]````]```````````````````````````````````````````````````````````````````````````]``]``````````````]]]]]]``````````````````````]]]```````````]]```````````````````]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]````````]]]]]]]]]]``````]]]`````]]```````````````````````]]]]```````````````````````````````````````````````````````````````````````````]]]]]]]]````````]]``````]]]`````````````````````]]]```````]]]```]]]`````]]``]]``````````````````]]]````````````````````````````````````````]]````````````````````````````````````````````````````````````````]]]`````````````]]]```]]]]]]]]]]]]]]]]`````]]]]]]]]``````````````````````````````]]]]]```````````]]```]]]]]````````````````[``````]```````````````]`````````````````````````[[[[[[`[[``````````````]``````````````][[[[[[`````````````````````````````````````````````````````[[[))``[)))[`",
+"[[[[))))```[[[))[[[[[[``[[[[[[[[``[[[[```[[[```[)))````````````]````````````````]]]]````[[[[[`````````````````````]]]''']]]]]]]]]]]]]]]``]]]]]]]]]]]]]]]]]````]]]]]]]]]]````````````````````````````````````````)```````````````````````````````))``))````````````````````````````````````````````````````````````]]]]``````````````````````````````````````````]]]]]]]]````````]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]````````]]]]]]]]]]]]````]]``````]]]`````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````]```````````````````````]]]]``````]]]]``]]]]````]]``]]```````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````]]]`````````````]]]`````]]]````````]]]`````]]]]]]]]`````````````````````````````````````````````````````````````[[[[[[[[[[[[```[))[[[`````[)[[[[[[`[[[[[[[[``````````````````[[[[```````````````````[[[[[[`[[[[[[`````[[[``[[[[[[[[[[[[[[[[````````[[[[[[[)[[[[[[[[)))))))))))))))))))____)",
+"))))))))[[[))))))))))[[[)))))[[[[[[))[[[``````[)__)))`````````````````))))))))``))))))__))))[[``)))))))))))))```````]]]]`````````]]]]```]]'''']]]]]''''']`````````````````]]]]``````````````````````````````````)))``)))`````)))[[[[[[[[[[[[[[[[))))))))))))))))))``````))))))))````````[[```````````[``````````````````````````````````````````````````````````]]]]]]]]````````]]]]]]]]````````````````````````````````]]]]]]]]]]]]````]```````]]]]````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````]]]]]]]]`]]]]]]]]]]]]]]]]]``]]``````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````]]]]````````````````]]``````]]]]]]]]``````````````````````````````````````````````[[`[[)))))))))))))[[[[[[[[[[``[)))))[[[[[[[[`[[[[`[[[`````````````[[[[[[[[))))))))))[[[)))[[[[[[[[[[[[[[[```[[[````````[[[[[[[[[[[[[[[[[[[[[[[[[[[))))))))))))))))))))))))__)))))))))_____",
+"__)))[[`))[[[[[[````````[[`````]````````]```[[))___))))`))))))``))))))))```````````[[[))))__________))))))))))))```````)```````)```]]```]]`]]]]````]]```)``````]]]]]]]]]]]]]]]```))))))````````````[[``````````````)))))))))))))))))))))))))))))_)))__))))))))))))))))))))))))))``[[[[``[[``````[```[[[`````````````````````````````````[[``````````````````````````````````````````````````````````````````````````````````````]]]````````````````````````````````````````````)````````````````````````````````````````````````````````````````[[[[[[[[````````````````[[[[``````````````````````````]]]]]]]]]']]]]]]]]]]]]]]]]]]``]]````````````````````````````````````````))[[[[[[[[```````````````````````````````````````````````````````````````````````````````````````````]]]]]````````]]]`````````````]]]]]]]]````````````````````````]]]```````````````````[[))))_)))________[)))))))_))))))[))))[[[[)[[[[[[[[[[[[```[```````[[[[[[[[))))))))))))))))))))))))[[[[[[[[[[[[[[[`[[```[[)))))))))))))))))))))))))))))))__________))))))))________________",
+"__))[``])[[````]```]]]]]``]]'''']]````]]``))))___)))))))))))))))))))))__))))))))))))_)))____________)))``)))))))```````)````````))``````))))``))))))))___)``))]'''''''''']``````))))_)))))))))))```[[``````[))))))))))))))))))))))))))))))))))))_)))___)))))))))))))))))))))))))[[[[[[[[````````)[`[[)[`````````````````````````````````[[[[``````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````))))))))))))))))))````````))))))))))))))))))))))))````````````````````````````````````````[[```````````````````````````]]]]]]]]]]']]]]]]]']]]]]''']]`]]]]````````````````````````````````````````)``````````````````````````````````````````````````````````````````````````````````````````````````]]]]]]]]]]]]]]''']]]]]````````]]]]]]]]````````````````````````````````````[[[[`[[[[)))))___))))))))))))_________________________))__________)))))))))[))))))))[[[[[[[[[[[[[[[[))))))))___))))))))))))))))[[[))))))))))))))))))))))_________________________________}}}RR}_}}__",
+"___)[```[[```]''````]]]]``]]'''']``````]``[[[)))))))))))_________________________}}R}}______)))[)))```]]``````))))````````````))))``````)))))`))))))))___)``))`''''''''''']````````))))`))))))))``[[[[`````[[)))_)))))))))))))))))))))))))))))))))))___))))))))))))````)````````[[[[[[[[``````[[)[`[[)[`[[[[[[[[``````````[[[[``````````[[[[````````````````````````````))))))))``````````````````````````````````````````````````````````````````````````````````````````````))))))))))))))))))````````))))))))))))))))))))))))````````````````````````````````````````[```````````````````````````]]]]]]]]]]]]]```]]]']]]]]'''']]]]]]`````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````]]]]]]]]']]]]]]]'''']]]]``````]]]]]]]]]]```````````````````````````[[))))))))))))))))_______))))))))))))))________))____________________________________))))))))))))))))))[[[[[[)))[[)))))))))))))))))))_)))))))))))))))))))))))))))__________}}__________________}}}RRRRR}}____",
+"))))[```[````]]]```````````]]]]'````````]``````[)))))))))__________RRRR_________))))))```````]''`]]]]''']]]]]]``))``]````````````````)))``)````))))))))))))))```]]]]]]]]'''''''''']``````````````))))))`]]``````))))))))))))))))________________))))___)))))))))))))))))))))))))`))))))```))))))))`))))`))))))))``````````))))``)))))))))))````````````````))```````````))))))))````````))))))))))))))))``````````````````````````````````````````````````````````````````````))````````))))))))````````````````))))))))````````````````````````````````````````````````[[``````]``````````````````]]]]]]]]]`````````]]']]]]]]]'']]]]]]`````````````````````````)`````````````````````````````````````````````````````[[````````````````````````````````````````````````````````]]]]]]]]]]]]]]]]'''']]```````]]]]]]]]]]]```````````````````````````[[[))))))))))__________))))))))))))))))))))))))[[))))_________))))___))_____)________))))))))___))_____))))))))[[[[))[[````````[[[[[[))))))))))))))))))))))))[)))))))______}}______________________________))",
+"[[[[````````````````````````]]]]``````````[[```[```````````)))))`)_____))))``````)))``]']]]]]]]]''''''']'''''''']''''']`''''''']```)))))`)))```)___)))))`)_)```)```````````]''''']`)))))````````))))))))``]]]''''''``))_)))))____________________)))____________))))))))))))))))`))))))`))))))))))``)))`))))))))`````````))))))`)))))))))))````````````````))```````````````````````````))))))))))))))))````````````````]]]]]]]]```````````````````````````````````````````````)````````````````````````````````````````````````))))))))))))))))````````[[[[[[[[````````[[[`````]]]````````````````]]]]]]]]``````````]]'`]]]]]]]']]]]]]`````````````````````````))``````)`````````````````````````````````````````````[[````````````````````````````````````````````````````````]]]]]]]]]]]]]```]]]]]````````]]]]]]]]]]]```````````````[````````]```````[[[[[)))_________))))________________)))_)))))))))))))__))[[)))_)))___))______)))))))))))))[[)))_)))[[[[)))[[))))[[```````[[[[[[[[))))))))))))))))))))))`[[[[))))))_____________________))))))))______))",
+")[[`[))[[[[[[[````````````[[[[``[``[))``[))[`]``)````))`````]]`````````````````)`````]'']]'''''''''''''''''''''''''']]]]`````]'''']`````````````]]''']``))))))))))))))))))))``]]]]]]]]``)))``)))))))))``)`]]]'''']]]]``))___))___)))___)___))))))__)))))__)))))))))))```````````````````]`))```)``))))``))))))))``)))))`````````))))))))))```)))```````)```))```))))))))```))```))``))``)))`)))`))````````)`````))``````````````]```]]]````````]````))))))``))``````````))))))`````))```))))````))``)))```)```````````)))))))```))))))))))))))))````````````````````````)))[[[[[````````````````````]]'']]]````]']]]`]]]]]]]]]]]'']]`]]]````````````````````````````````````````[[[[[[[[````````````````))``````````````````````````````````````````````````````````````````````]]]]]]]]]]]]]]]]````````]]]]]]]]`````]]``````````]]`````````]]]]```````````[)__________)_____)))___________)))))))__)))[))))_))[))))))))))____))))))))__)))))))[)))[[)))))))))))``[[[[[[))))))))[)))[[))))[```[)[[[)))___)))[)))[)))[)))))))))))______))))______________)_______",
+"))[[))[[[[```[[))))[[[[[`````]]']]`)____)_______))`````]]``]]]````````````]]]```'']]]]]]]]'''''''''''']]''''''''{'']``)))))))```````````]]]]````]]'''']]````))))))))))))``))``]]]]]''']`))))))))````))))``]`]'''```]'']``))))))))))))))))))))))))__)))))_)))))))))))))````))````)))``)))``))```)`))))))`)))``````)))))``)))))))))))```))))))))))))))))))```)))``)))`````````````)```````)```````````))))```````)````````````````````````)))))))`````````)```))))```)))))``````]]))))))``````````````````````````))))))))````````))))))))))))))))[[[[[[[[```[[[[[[[[[[[[[[```````````````````````````]]]']]``````'']]]]]]]]''''''']]]`]]]````````````````````````````````))))))))[[[[[[[[```````````)````)))`````````````````````````````````````````````````````````````````````````````````````````````````````']]]]]``''''''''`]]]```]`````````````[))_)))_________________________)))_______________)))))))[```[[)[[))))__)))))))))))))))))))))))))))))))))[[))))))))))))))))[[))[[[)[))[[[[[[[[[[)))_))))))))))))))_________)))___))_______________________)",
+"__)))))[))[``[))____)))))_____))]``)____)[[)__)`))````]''']]']]`]]]]]```]'']]]``]]]]]]]]]]]'''''''''']]]'''''''{{'']``))```)))))))))))))````))))))))))))``````))`````)))))))))``]]`]]']`))))```))[```````]]``]']))``]]]]``))))))_____________)))_________))))_))))))))))``))````)[[[[[[)``[`````[[[[[[[[)))))))))))))))[)))))))))))))))))))))))[````))))```)))``````````````````)```````)`````))````)))```)````)```)))))``````````)))```````````)))`````````)))``)))))__RRRRR_))``````````))))))````````````````)```````````````))))))))))))))))[[[[[[[[``[[[[))[[[[[[[[```[[[```````````````````]]]'']]']]]]]]]]]]]`]]]]]]]]]]]]]]```]]]]``````````````````````````````))))))))[[[[[[[[````````)))))```)))````)````````````````````````````````````````````````[[[`````````````````````````````````````````````]`````[)`````[[[[```````````[[[)[[[)))))_______)))______))))__________________________________))[))___))))))))))))))))))))))))))))))))))___))))))))))))))))))))[[[))[[[)`[))))[[))[[[[))_)))))))________________)))))______________)))________))",
+"}}}RRR}_RR}_____R}____))[)))__))[[`````]````[``]``````]''''''']]'']]]]]]'']]]```[[[`]]'']]''''''''''']]]''''''''''''']]]]]]]]```]]]```)))))))))))))))))`))))))```````)))))))))```````````)))`]``[`]''''']']``]']```````````))))))[[)))))``````]]_____)___))___))))))))))`````````]]]]]]`]]]'''']]``````][[))))))))))))[[)))))))))[[`````````[[`]]``````````))))`````````````````))))))``))))))___)))))``)))))``))))```````````````))))`````))))))))))))))))```````))))__RRRR__))`````)))````````))))))))))``````````)))``````)))))))))))))))))))[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[`````````]``````````]]]]]]']]]]]]]]```````````````]]]`````]```````````))))````````))))))))))))))))`[[[[[[[[[[[[[[[)))))```)))`````````````[[[`````)))))))))````````````````````)))[[[`````````````````````````````````````````````[)))))))````[)))))))))))))))))))__))))))__)))))[))))))__))))))________________))____________}}}}R}}}___))))))))))))[))))))))))))____))))________))))))))___))))))))))[))`[)_))))))))))))))))))))___________________)_______________))))))))_____",
+"RRRREERREEERRRRRR}_____)))_____))))``]]]''''''']]'']```]]]'''''''''']]]]]]``````[``]]''''''''''']]]''''''''''''''''''''''''''''''''''']`']]]````))))_))))))))))))))))))`))))````))))``````)`]''''''{''']'']``]]]]]]``````]]]``)))[[)))))[[[[````````````````))``)))`````]]]]]]]''''''''']''''''''']]]]''']]```]][[`````]````````]]]''''']]]```]]']]]`]]]````)))```````````````)))))))````)))))__R__)))))))))))))````````````````````))``````````))````))))))`````````)))]]``))``))))))__))))))))__________)))))````)))))``````))))))))))))))))))[[[[[[[[))[[````[[[[[[[[)[[[[```[[[````````````]````````]]``````]]]]````]]]`````````````````````))))))))````````))))))))))))))))[[[[))))))))))))))))````)))````)[[[[[[[[))[[[[``)))))))))`````))`````````````)))[[``````````````````````````````````````))))))``[)))))))________))))___)___)))))_))))))))))))))[))))))____))))__________}}_____________}____RRRRRRR}___)________)))))))))))[[)))____________))))_____________)))))_)))))[))))))_)))_____))))))))____))________________________}}________)____}RR",
+"___}RRRRRRRRRRRR_______)}}}___))``[)))__))[`''']'''']```]'''''''''']]]]]````````''''''''{'''']]]]]]]]''''''''''''''''''''''''{{{{{{{{{{'''''''''```)))))`)))))))))))))``)))))))``)))``]````]]''{'''''''''']``]]]````)```)````)))_)))____))))))))]]``]]``]]]```]]```]]]'']]]]]''']]'''']]]]''']''''''''''''']]]'']]]'''''````````]]]]]]]]```````]]]`````]````````))))))))``````))))))```)``))``)__)))))))`))))___)))_____)______)))`))))))))))```))````))``))))))``````````)))))))))))_______RRRRRRRRR_____)))))``)))````````````))))))))))))))))[[[[[[[[)))[[```[[[[[[[[)[[````````````````]]]]]]]]]]]]'''']]]]]]]'']]]]'']]]]]`````````````````````))))))))))))````````))))))))[))))))))))))))))))))))))))))))))))))))))))))[[[))))))))``````))))))))))````))))[[[[[```[[````[[``````````````````````))`````)))))_______________)))__))__))))))))))))__)))))_))))_________)))__________}}}}RRRRRRRRRRRR}}}RREEERRRRRR}__________))))))))))[[)))[))___________________________)))___))__)))))))_))))____)))))))))__))))_________________________}_______________",
+"))))______________________))`]''']``[)__R}__))))`]'''']]'''''''{]]]]]]]]]`````]]''{{{{''{{'']]]]'']]]]]]]''''''']]]]]''''''''''{{''''{{{''''''''{{{{{{{{'']]`````))))```)))))````````]'''''']]'{]]'''''']]][[]]])```))``)````)))[`]]``]]]]]]'''']````````]]`````]]]]]]]]]]]]]]]']]]]]]]]]]]]``]]]]]]]]]]]]]]]]]]]]'''']]]]]]]]]][[[``[[[[[``[[[`]]``````````````))))))))))))))))))_)))))`)__))__))))___)______RRRRRRRRRRRRRRRRRR__))____RRRRRRRR______________RR____))))__))))))__)))___)))_____RRRRRRRRR_))___))_R__))_))))))))))))))))))))))))[[[[[[[[))))))))))))))))))[`[))_[[[)))))))))[[```[))[``]''']]]]']]]]]]``]]]]`````````````````[[[`)))))))))))))))))))))))))))))))))))))__))))))))_)))))))__)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))[[[[[[)```````````````````)))))))))))))_______})))))___R}______________)))_____________________))____________}}}RRRRRRRRRRRRRRRRRRREEEERRRRERR}__________________))))))[))_____________)))_________)))))___))__))))))))))))))))))))))))))_)))))________________))))))))}}_______)))))))",
+")))))______))______________)[`]''''''']`'''][))[)`]'''''{{{''''{]]]]]```]]]]]''']''{{{{{{''']''''']``````]]'''''``]]''''{'''''''{'''''''{{{{{{{{''''{{{{{'''''''````````````]'''``)``]'''{{']`''{{']]]]`]]]``]]]''']``]'`]']``]][`````]][```]]]]]````````]]]````]]`````)```````]`]]]]]]`]]]][[]]]]]``]]]]]]]]]]]]]]]]]]`]]]]]]]]``]]]```[`]]`[[`']`````]````````))))))____________________RRR__R__RRRRR_RRRRRRRRRRRRRRRRRRRRRRRRRR___RRR_RRRRRREEERRRRRREEEEEEYYRRRRR________RRRRRRR_RRRRRRRRRRR)_RRRREEERRRRRRRRREERRRE____))))))))))))))))))))````````)))))___))))))))_))))__}______}}RRRRR}}}_}RRR___```````````````[`````[[[```````[``[[[[[[))))))))))))))))))))))))))))))))))))_______________)))__________))))_______))))))))))))))))))___)))))))))))))))))))))))))))[[)))[[[[[[[[[[[[[[[[``))))))_______R___________RRREEERRRRR}________________________)_______)____}}}}}}}}RRRRRRRRRRRRRR}_____RRRRRRRRRRRREER____________________)))))______)))))))))[[[[)))__))))))))))__)))_))))))))))))))[[)))))))))__)))))))))))))))_________)____}}____))))))[[))",
+"`))))_))))____))_________))))[``]]''''''`]'''{{{'''''''''''''''']]]]]]]]]````]]]{{{{{{{{{{{{''''{'']]]''''{{{''']]]]]'''{{{''']]''''''''{{{{{'''{{{{{{{{{']``]'']]]]]]]]'''''{{{{{{{'''''''''']]'']]]]]]]]]']]]`]]]]]]]]]``````]]]]]]```]]]]]]]]']]]````]`[[``]]]'']]`]]]]]]]]````]]]']]`]]``]]`[[[`]``[[``[`]][`]]`[[`]]]]`[[[`[[[[[[[[[)_)]{'`']`[`''`]]]`[))[`))____RRRRRRRRREEERRREEEEEEEEEYEEEEEEEEEEEEEERRRRRRRRRR_RRRRRRR}RERREERRRRREEEERRYEYKWWWERWWWYEW}EERERRRRRRRRRR_RRRRRR_RR}RR}_____((RRRRREERRETRRR}RREER}_______)``))[```[[))__)))))))_))____________)[))))))[[[[``[```[`[))[[)[[))))))_)))))[][``]''````'']```'`[)[````[)))[))_))__))______)))____)_^R___^_))^___^^^^^^^_^^}RR^^^^^R^^_^^^_______^^_______)__`____))__________))_________)))__)))))))))))___)[```[))[[))))))))__^RRR^_RRRRRRR(RRR})))_((REEER(}RREYYYEEER((}}}______))^__)__))``))_))`))))))))}}(RRR((}}(RRRRRR((}_____}}(((RRRRRRRR__RRRRRRRR__________))________)))`)```````))))))))))))))))))_________)))))___)))))))))))))))[``[)))____)))____________________)))))))`````",
+"`)))____)))__)))__))))_____)))))```]]]]]]]'''''''''''''''''''''''''']]]]']`]]'''''''{{''{{{{''''{{{{{{{{{{{{{{'']]''''''{{{{{{{{'''''{{{'''''''''''''{{{'']]]''{'']]]']]]]]]]]]]]]'''''''''''']]'''''''']]]]]]`[````[[[[[[[[[[[[]]]]]]`````]]]]]]]``````]`[[`]]]]]]]]`]]]``[[[[`]]]]]```''][[]]`[[[`]`[[`]][[`]`````]]``[`]`````[[_)[[[))[''[)`{]]'{{'``]']`)__)_______RRRREERRRREEEEEEEREYYEEREEEEEYYKJYYEEEYYYERRR___)`)_)`)RYEYYYYWWYKKLLJKWYWYWERRRYWxlFFlhlFKLLKLKWYR(_(EYWYER}}}RRRREEYYWYEERRRREEERRRR}REYYETRRRREERRRRR}____)`)______)))))______________RRRRRR}_______))```[))))``[)))__^^^______)))))`]]````````````````[[[[[[[))))___________}______}}}RRRR^__}_)_^}}}^^}^^^RR_^RRRR^_^RRRR^__^}}^____)___))_R_____}RR______________________________________))___))))________)))))))))___^^^^____}((((RRRRRR____(REYEERREEERRREERR(}_)___)))__)[[[```````))___))))))))((RRRRRR((((RRRRRRRR(}___}(R((}_RRRRRRRRRRRRRRRRRRRRR_____)_____))))))``))````))))))))))))))))))))))))))___________________)))))))[[[[))___)))))_))_____))))_____)))))``)))`````",
+")))___________________________))))))``))``]]'''{'''''''''''''''''''''''''']]'''''''{{{{{{{{{''''{{{{{{{{{{{{{{{'''''''''''''{{{{{{{{'''''''''''''''{{{{{{{''''''']]]''']]]]]]]]]`]]]'''''''']]]][[[[[[[[]]]``[[[[[[[[[[[[[[[[[[[]]]]]]`````````````[[````[[[[```]]]]```]]]`[[[``[[[[[[[[[``[[[`[[[``````)[[)_)[[`[[[`[[_))[[))))[_^^[]]`[__))_)]][)``[`{]''`[)))_RRRRRRRRREEEEEREEEEEEEEYEREYKKEKYEEREEY__))_RRRER_)']`]'']']`)))))`[)))'][)[`''{]RYHcg9XX.171-XX1XXXX17fhhhgcHERRRYKYEEREYYWKWYEYYEEEEYREEYYEREYYYYYYYYEERRR__)_RRR_)_R))______))_____^RR^^^RRR}^__^^_______))[)))_____RRRR_))___^___________))``)))`````)))```_)))_____________RR___RR_____RRRRRRRRRRE_}RR__}RRREERRRRERRRRRRE_RRRRRR}RRRRRRREREERR}}}E}_RR}_[RR_RRR__RRRRRRRRRRRR______RRRR__________RRR_____))))))))__________________}}_______RRRR__RRRERRRR}__))))___}}_))__)))_^}RR}_))[[))))__RRRRRRRRRRRRRRRRRRRRRRRREERRRRRR}}RRREEEERRRRRRRRRRRRRRRRRRRRRR____)______)))))))))))))))))))))))))))____)))))))__________________________)))))))))))))))_)))_____))))________))))))))````",
+")))____________________)___________))))))```]'{{''''''''''''''''{{{'''''''''''']''''{{{{''''''''{{{{{{{{{{{{{{''{{{{{'''''''''''{{'''''''{{{{{{{{{{{{{{{'{{{{'''']]]''']'']]]]]]]'''''']]]]]]]]`]]]]]]]]]]``[[[[````````]``````]]]]]]````````````[[[[[```[[[[[[[[[`[[[[[[[[[[[[[)))______[[[[[[[`[[[))[[)))))[[)[[))[[[[[[[[)))[)_^_)[[[[[[]''`[``'{{']]]''']]]])__RRRRRRRRREEEEEEEEEYYYREKWEEKKYER_))))``]]`__R_)`]''``))))_RRRRRRRRRRRRRRRRREERYHzhXXX.XXXXX;7X.;<1;.XX.;XX;fcHWR(_))_((})_EWWWWLLLKWWWLWYKWRRERRRRRRREERR____^^}RR}^_^____)))^^^^^}RR}}}}}}}}RR^_____________))______)))__)____}}}__}___^__}}________)______}}____}}_RRRRRRRRREEEREERRRRRREEEEEEEEEEERREEERRREYYWYYEEEERRREEEREEEEEEYWEEEE((ERRR(REERR}(RRREERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR}RRRRRRR_^}}}^__}RRR}}RR}}}RRRRRRR__}}}RRRRR((((RRRRRRRRRRRTRR}^RRR}____)___}}__}____^RREEEERR(RR____RRRRRRRRRRRRRR}}RRRRRRRRREERRRRRRRRRREEEEEERRRRRRRR___RRRRRRRRRRRR_____R___________))____)))))_____))_____)________))))))))))))__))________))))))))))[[[)__))_______)))___)_____))))))))```",
+")))____)________))___)))____________))))))))`]''''''''''''''''''{{{''''''']]'']```]]'''''''''''''''{{{{{{{{{''''{{{{{{''{{{{{{{{{{{''''''''''{{{{{{'''''`]''{{{{']]]]]]]'''''''''''''''']]'']]]]````]]]]]]``[[[[```]]]]]]]````]]]```````````````[[[[[[``]`[[``[[[[[[[[[[[))___))_______)_)[_^_____)__^RRRRR}_)_RRR^______^^RRR^__)))____]'`_R_```][[[]][]]''{{{{{']`))))RRRRRRRREEEEERRRYYYEEER__))`````)```)___)]]`]`)``_R_)_REREER_`]]`)))[[)__[`'}KLFSxlchg977:-<---;;---;;-XX6hlxxxxzzSHHFFHchgffghh99lKLHLKYEERRREEERR(}(RRRRRREEEEEEEEERRR^^^}RR}}RRRRRRRRRR}}}}}}}}______))__)))____}}_}}_______}))))))__}}RRRRRR______^}}}}}}}}}RRREEEERREYYEEEEEEEEYYYYREYWWWYYYYEEYYERRRRREEYEEEYWLKYRWWYWWWWWWEWLSSlchcxLWWWYEEEE(_RYRRERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRTTEEETRRRTERRRRRR}}}RR}}}}}}}}}}RRRRR}((RRRRRYYYYEEEETEEYYEEEEEEEEEEEEEEERRRRRRRRRRRRRREEEEEEERRRRRRRRRRRRRRRRRR}}RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR__________))______))_____________)________))))))))))))))))________))____))[```[)________________)))_))))))))))))``",
+")))___))____________________________))))__)))))`'''''''']]]]'''''''''''']]]]'']```]]]]]]]]'']]'']'''{{{{{{''''''{{{''''''''{{{{{{{{{{'''''''''{{{{{{{{{{]'''']]`']]]]```]]]]'''']''''''''''''''][[[[[```````[[[[```````````[[```````[[[[```[[[[[[[[[[[[[[[)))))_)[[[)))[))))))____))[[[[)_^TTTRRR}))_RRERRRR__RER^_)^RTEEEEEETR^RR}}RRR}R}}})'{{]]]``[[[]]''''''{{'''']`)__RR____REWKKKKRR[`RE}))`````)))`````]]`]]`']`''`)`'{{{{'``'{{{{{']]]]`{{`)[{{{){{`_(Ll7------333,,<<,,XXXXXX.6771;;;11-.XXX...X1cLWKWEYYYEEYYWYERRREEERRRRRRYKYYWKYTRRRRREERR}RREEEEEERRRRRRRRRRR(}}}}_}}}}__}_)__)```}__))_}}R}}}}}}})_}RRRR}RRR}}__)`[)__))_(RRRREEEWYYWWYYWWWWWWWWWWWWYEEYWWLLWYWLHxSFFSxllggg999fgggffffff7771111;;..69ff9fggghcSWEYYYYEEEEEEEEEEEEEEEEEYYEEEEEERREEEEEEEEEERRREEEYYYERRREEEEEEEEEEEEEYYYWWYYYWWWYEYWWIYIIYYIIIIIIEEEEEEEEYYEEEEEEEEEEEEEEEEYYYEEEEEEEEEEREEEEEEERRRRRRRRRRRRERRRRRRRRRRRRRRRRRRRRRRRRRRRR____))``______________))_)))____)________________________)))))))))))))))))))))))))))))))________))[[))))_______________)_____)))))))))))",
+"`)))____R______RRRRRR}_______________)))___))))_]]]]]]]]`````]]''''']]]]]]]]'']`]]]']]]]`]]']]''''''''{{'''''''''''''''''''''{{{{{{{{{{'''{{{{{{{{{{{{{{{{{{']`[''']`[[]]]]]]]'']]]]]]]]`]]]]]]]'''''''][[[[[[[[[[[[[```[[[[[[[[[[[[[[[[[[[[[[[[[[))))))))_____^_))))))[__)))__^^^_))__^^^^TEETRR}___RRR_))))_^R__^RRTEEERRR^__)````[[``{`)`_WzlihHR`)['`]]]]]]]]]''''````))_)))'`}EKHzzxhhzLR`__))``]]])`````]'`']`']]'````)_)`_}RYKKLHFNzzzzzzHKLHzlh9hhhccg1X--glgf,,--;--X.;1.X...XXXX--;,,---<<,,<<.;9hllxzxzSFLLKKWWWWWWE(EEEEEEYYKWWWR_}RRRRR}_RR}RREEERRREEYWWWWWWWWWYEERRER((((((RYWWWWEERRR(_)))[[))))RRRRRRRR___REERRYWLLLLLLWWWYEEYWLWYWWWWLWWWWWWWWWLLHSlg991.6f91X-;11;-XX-;;;;--X.XXX;1;X;>>>;;>>..XXX.;;X;.XXX9xKKWWKKWYYYYWWYYYWWWWWWWWWYYYYYYEYYYYYYYYEEYYERRERRRRRRRERRRREEEEERRRRRREYEREYWYEWWWWWWKKWKKKIIIIWWWWWWYYEEEEEEYYEEEEEEYYYYYYYYYYYEEEEEEERREEERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRREEEYYYEEEEEERRRR_))))))))))))))))))))))__________________RR_______)))))))____)))))))___)))))_________________))[[)))____________________)))))))))",
+"``))____R______R__}}}__________________)__))))))```````````````]]]]]]]]]]]]]''']]]]]`````]''''''''']]]]'''''''''''''''''{{{{{{{{{{'''''''''{{{{{{{{{{{'''{{{{{{{'{{'`[[]``]]]]'']]]]`[[[[[[[[[[[[[[)))))))[[[[[[[[[`````[[[[[[[[[[[[[[[[[[)))))))))_____[[))))___)))__))}^^_^^}RR}^_^^RRR___RRRR((RRERR_R__RREEEWJHNHJWYETR}____REWKLLHFScgv919cKLKRELK_```]]]]```]'''`)]]]]``))`]{{{{'`)JHxhx_{``]'']]`''''''''`']```)`]```_YzcNHLLLKKKRR_)))__RYLHh169W}_}{{W6--hlg7;1f7.7cLWWWEEEYWLSSDc7->3>---------,-X;1;....;1677166669hlxzSxxxFWLKKKWKSchhcxSzlhhgg999fgggff77771111111777779fgfff71111;11679hxFWWWWLLLLWWYRREYWLLScg97971.XX...;;17ff9719gg9f96ff999ffggf7661.X..;;.X.1;;--;;,,1,;;,,;-;.1fhcgf;;;,,>379gcg7;--1;-17;;7zLWWKLLLKKLLLLKKKKKKKKKKKKWWYYYYWWWWKLLLKFzxFLKLLLHFFSzxxxxxxlllllxSSSSzzSSzlcclxFLKKKKKKKKKKKKKWWWWWWWWWKWYYYYYYEEEEEYYEEEYYWYYYYEEEEEEEEEEEERRRRRRRRRRRRRRR_RRRRRRRR__RRRR_____RRRR__________________)_))))____)))))____))____R_____RRRRRR_RRR__))))))___))))))))))___________________R}___)``))))________________))))))))))))",
+"``)))___________}}______}___________))))__))```)]``````)````]]``]]]]]]'']]]''''']]'''']]'''''''''''''']]'''''''''''''''']'''']'{''''''''{{''{{{{{{{{{']`]]'''''{'''']]`[]]']]]'{''{{{{''''''''''`]]]]`[[__))))))^_^^^^^^)[[))[[_)))__))[_))[))__))))))))`))R[_[_))}__R)R_R}_RRRR^R_)___}}}RR(__RYYYYE__RRR}_____RR}}_)R}_YREKLHHzxllxzc1XXXXXX1x{']`)_^R___))[``]]]]]]]]````]]''`````````]'''']`]]]]]]]]]]]]]]]]]]]]]]]]]]]`````]'{{''''{''{{`RWWYERR})')`]])Wc1fH((SLEYYHF({{'{{'{{{{{{'(Dg7::>::::::::---;;;;;;;;;;;;;;;;;..........--;;11;;.XXXXXXXXXX.-XXXX.-----;;;,3----,-1;;--.X,X--7;.;;---,,XX;.;;;;;...;79ff71--------<<<<<<<<--------..........----...<<<.-1.;<1;.;1<>,,-->>->-3--77fclccgfc7<71;;-;77ff7-X--;-,7X-3-1hSWWLLWKKWWWWWWKWWWYWKLWWWWWWKLScggf;-71;;..;111;;;.XXX.XXXXXX111.X..XXX.XXXX1XXX.969cLWKKKWLLKLLKKKKWWWKWYKKWWWYYYWWYYYEEYYR}RRRRRRRRRRRRRRRRRR_______________________RRR____R____)))_R____RR___R_________)`)_____R___)))___RR_RRRRRRRRRR__RRRRRRRR___)))))___``)))))`))______)))))___)_____)``````)__)____))))))))))))))`````",
+"```)))__________R}}___}}____}}RRR___)))`)))`````]```````````]]]`]]]]]''']]]''''']'''''']''''''''''''''''''''''''''''''''''{'''{{{'''''''{{''{{{{{{{{{{{']]]``]''[`]''{{{{{''''''{{{{{{''''''''''{{{'']]`]]]]]]]][]][[[[)_[`[)[[[[)))))))[_^_)[[))_______^__^^}^^)RR_`]')RRYWEYWYR)RE__R([}(_ESxSKKYER}RR}_))[```]]]}(RE}YWYWY}RYHxc9X1gclLRYLxlW]]]]]]]]```]]]]]]]]]]]]]```]]]]]]]]]]]]]`]'''']`]]]]]]]]]]]]]]]]`````````````]]]``]'']]']`]'''`['{{'[)))])EFccFY''`{{{{'R{{`)''`{'{`WSlg7,---:::::::::::------;;;;;;;;;;;;;;;--->>>>>,,,>>,,,>>->>>>>>>>7;-,33;->>33>5>>55>f7->7,-,7377X77---,777,---,3,,>-->,,>;;--;---;;;;;;;;::::::::::::::::------------:,,,--XX-711,--<777g---77,:3-3ffgcDGFFxcxl7;X7fgcg7,-7ffgSE(l7X--,,-X.7hxSSzSFFFFSSSSSSSSxllhcllchhhfff3;,3;;;;;;;,3;;;;;;;;,;,7737flSlf;...6gclSWR}Wl1XX..gxSSSSSLWLWWWWWKLLHLKKWWKWWWWWWWYRR}(RRRRRRRRR_RRRRRRR___________________________)_______))))))))))))__________RRRRRR__)__))_____RRRRRRRRRRRRREEEEERRRRRRRRRRRR______________))``))))))_________________)))))))__)))___)))))))))))))`````",
+"```))))_________}}}}}}RR___}}______))````````]``]]``````]]`]]]]]']]]]''']]]''''''''''''']''''''']''''''''''''''']]]''']]'']]]'''{{''''''{{''{{''{{{{{{{{{'']]]'{``]]'''']]]]]''''''{{{{{{{''''''{{{{{']]``]]]]``]]]]``[[_))__))))))))))_)[`[_^_[___^^_^^__)[__}R[])KzLLzczHW(RERHcFYzxLLLlcllhlWWWYRR}_)))[``[))}}}R(}R}[_RFlh6X.19cH('{{{{'{{)``````]'''''']]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'']]]]]]]]]]]]]]]]]]]````````````]]]'`````]]``]]]`]'')````[)))WHK}'{{'{)_RRRWREKKKLHKLlgg7;;----:333:::::::::::------;;;;;;;;;<<<<<<;>>>22222>>2222222222222233>>>233>5-5>>>>>75--37-7-37XX3>->->3-XX,-,3-->:->32---373>-5>332222222244444444444444442222222232:::337ffccllffgffS((LLDg:XX-,3fgglDDGGSxFlll17WWE(_(WF,cLWEWFlg,-,,:,-;.XX;11111711111;;;;;;.XX.11.XXXgcg7:33-:>>2222>:>>>2233>55>>>27,----;gL{{{{'{{{{{'Wxh;.;7gcxSSSSSxchg91699fclxxxzzxxxxzSSHLWYR)RRRRRRRRRRRRR__)))[[))))))______)))[))))))))____________))))____________RRRRRRRRR_____________RRRRRRRRRRRREEERRRRRRRRRRR______________)`)```))______))))________________))))____))))))))))))````",
+"`))))________________}}}_}}}__)[))))))``````````]]]]]]``']]]]']]'']]]]'']]]]]]]]'''''''']]'''''''''''''''''''''']]]'''']]]```]''''''''''''''''''{{{{{{{{{{{''''''']]]]`[]]``]''']]]]''{{{{{''''']]]]]]]]]]]]]]]`[[[[[[[[][))[][_))______^_[[___))_^}^^^})RRR[[]]_KYYShXX99hhv9vh999hlHHzxSY_)((_))))___)_}___}RE(EEYREFzxh9XXX9xW){{{{{'_[`[{{`]```)))```]]]]]]]]]]]]]]]]]]]]]]`''''''''']]]]]]']]]]]]]]]]]]]]]]]]``````]]]]````]```]']]`]''`[[```````)_RR[''`[][{))))_EYLHKEELF7XX-;-;-3:------::::::::::::::::;;;;;;;;<<,,,,,,::5555553222222244444444:33--23-33,;>,,3-,,73XXXX-77,fxSlc777;gFSf7gggf>35--23332>>22233>>>>>>>>4444444444444444::::::::34:::433ffchllgDELDSFg7f33,7cSlgfcgf3,cDxlEWxl77xDDSFxg7-77----X--33--3-;11;XX-;--;;;;;;---;;1,;,;--;,11X----233::22222>2222222232:2>5-:-:>7gDY'`'{{'`_R(_(F91X;XXXX;777961XX..XX1XX.;--;;;.;;;;XXXXX9xKEEERRREEREERR__)________)))_____________))))____RRRRRRRRRRRRRRRRRRRRRRR_RRRRRRRRRRRR____))______RRRRRRR_RRRREEEERRRRRRRR_______________)_)))))))__________)))___________)))))_____))))))))))``))",
+")))))___________________}RRR__)[``))))))``)```]]]]]]]`]]']``]]]]']]]]]]]]]]]]]]]''']]''']]]]''''''''''']'''''']]]]]''''''']]]''''''''''{''''''''{{''''{{{{{{'']]''''''''{{']''']']]]'''{{{{'''''``````]][[[[[[[[[[))))[`[[)__))_[)_____)_TYT_`)!KJLJIT^_)}[_'^^RIh8cxc9809xHxxHNxi8xHBBKR)`)__))})[^}}}REEEERRYWWLLFFxf6XX.;611gxxxxllzHW_'])_)```````]']]]]'''']]]]]]]]'']]]]]`]]]]]]]]']]]]]]']]]]]]]]]]]]]]]]]]]]]]]]'']]]```]```]'']`]]''']`{']]']`)''`))[)}^_}_EzzLFHKYLh11--373:,,-:,37733:::::::::::::::<::::::::-:>>,,,,2222222222>:::>>22222222222233321171;.;1.1.X7hxchlf7lW'{`)(((FL__E){{))((((Lg>-5:>232>:->>>>>>>>::::::::44444444::::::::::::::::--,-7f7lcfX-gg7fff3-fcg7-7,,-3lSxghg7ffff7-XX--------:,,::---,3:;;>,3733--;>,,,,,>;;>>--3,------72>33:->>>>>>>22222>>:::3>>3333337fglSLW)RLxlzLYKSK(WHcfxSxc71-;1......1;71-33>3<---;;;;7cSSlxLYERRRRRRREEERR__)))))))))))))____))____))))))))____RRRRRRRRRREERRRRRRREEEERRRRRRRRRRRRRRRRRR_______RRRRR_____RRRRRRRRRRRRRR_________________)))``)))_____))))))))________)))))))))))))))`)))```))",
+"``))))))___)_________________))[))))))))````]]']`]]]``]]']```]]`]]]]``]]````````]]]]]]]]]]]]]]]]`]]''''''''''']]]]]]]]''{''''''''''''''']'''''''{{''''{{{{{{{''''''''''']]]]''{{{{{{''''{{{{'''']]]`[[[[))))))__[[[)_^_[^)[_^^)[[[)___)))TIIT!!R^TKHHHHHIKYYRIR_RKNhihchi9hh8ycchhxxhhchhhczWR}RRREKJWWKFFFSzxxlffgff7...;1.;;XXXXXXXX9L]{```]{']]]]]]'''']]]]]]'''''''''']]]]]]]]]]]]]]']]]]]]']]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]````]]]]']``]'''``[`]'']]{')REWHKE}_ELR_cf9hg;X<>,>---,3-<<-----:::::::::::::,,,>>>>>>>>::>>>>>>2222::::::::::22::::::::3-:7:-fDEWLFxh9.cFcX9W{`_(lcxhfflSFW((_){'{{'{{{'Wcf7777:,,,,,,,::::::::::::::::::::::::::::::::::::::--;-<-37X-X-;;,-X,7,<<----7,X-,<-XX-XX7,->>333735>7::3,---7--:,--,3:-:::--::::::,,3::::::-7fff7333----:,:-:::--::,::::::::----::--4-3glgcScg99lKYYLHWRE]'__')(lf-;XX;61.;<-,333>-5,<<<,,,>,hSHLWWKYEERRRRRRRRRR__)[)))____________`)))))))___))))_)_____RRRRRREEERREEEEEEYYYYYYYYYYYYYYYEEEEERRRRRRREERRRR______RR______RRRRRR____________)))))))```[[))__))__)))[__________)))))))```````)```````",
+"`````)))_________________)))[```))))))))```]]]]``]]]```]]```````]]``````````````]]````]]]]]]]]]]]]'''''''''''']]']]``]]''''']`]'''']]]''`]'''''''''''''{{{{{{{{{''''']]][[[``]'''{{{{{{'{{{{{{{{{']]````]]]]]]]`][[[^!!!!RTR^[[)_)))))___^REYYT!RREEEYIKJzhhihhxBI^^Bhhcckkchy99pjicKNhlzNBKERYKJBxhhhhyccch91....<...X;;.117fff9619lLR{_]]{`)'['']]]]``]]]]]```'''''''']]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'''``]]]]]]']````]]{'''']`````]''`_}RRERERFxgXX7gf-,,--33--3,,--<,7::::::::::::,,,,>>>>>>>>>>>>>>>>:::-------::::::--------:-,3--fSLLKE}RLxzLFc99FEYEW_}xhh999ghhhglLRYFlhg91-;3,--:::---:,::::::::;;;;;;;;;;;;;;;;<<<<<<<<,,,,,,<<,,;-;,;;3,--,7,---;1,-;7--,---;7>73-25-3>25-5552,---;<,7--,33--3:333::33::::::::::::232:37773--::,,::,,-:::--:::-----:::,,,,:---477::7777;X6xR`)[`}HcNK)']EL9-X7lxlg7777;--:::37<<----:>,;;7gxHHLKYYEEEERRRRR___}}RRRTTTRR}^__^^^}}^^}RRRTETR^^RRRRRRRRREEEYYYYYYYKYYYYKJLLLLLHHLHHLKKKKYYYEEEEEEYYEEEEERR__RRRR________________R_______))))))))[[````[[)_))))))))))______))))))````````````````",
+"`````)))_____RRR___________)```````))))`]``]]]````]]```]]``)````]`````````````))]``````]]]]]]]]]''''']``'''''']]']``[`]]''{']``]''']]````]''']'']''''''''''''''{''{{{{{{'{'][[[[`]'{{{{{{{{{{{{{'']]]]]]]]]]]``[']]`_RTTIHzHT_!I^^_))_^^_^}!!!^^ETR_}YHxzzxRE^HHJYIBkhci%phihy*htu8tjkhhxE])TYIKBNNHKLNxlxxc9.X;<---,77fgfcDlchcvxSHR{{'{'`']`{`]``]''']'''''''''''''''']]]]]]]]]]]]]]]]]]]'']]]]]]]]]]]]]]]]]]]'''''']]]]]]]]]]`]''']''`]''']]]``]]]]]]']]]`))][RRRWzScSf,glg3::,::,--3--<<<<--:::::::::::,,,,,>>>>>>>>>22222>>:::::---,,,,::--::::::::-,,-,77,6hL}[)}RWLxxlczHR)R}}R{]EKxh6XXXXXXXXXXX..;1,-,77777,<----------;;;;;;;;<<<<<<<<;;;;;;;;<;;;;<,,-,3,--7;;;,,-;,;;,<-;,,-<-7;;1-;3-73-375>3223255-,,;;,---7,--,,-::::::::444::444344434:::::::334---,<--,-<<<<<--<<<<<----<<---<<44-:3--;X11XX999hhihhyyYR_YLf9hW_'}FlFWWFlgf3:44<,,,::,3>--;119vzHKYYYYYEEERRRRR^}}RRRR}EETR}}RR^^^__^REYKKKYEEEEEEEEEEEYYYKKKKKKJLLJJLHzzzzHHzzHzzHHHHHLLKYYEEEEEEEYYKKYYEERRR______))))))_____RR___R______)______)))[[__))))))``))))____))))))))))))))````````",
+"```))))))_)))))))))))___)))))))```))))[[]]```]]]]]]```````]]```[````````))))))))]]``````]]]]]]]]```]]''']]]']``[]{']][[']]']`[`][[[``]'{`''''''''{{{{{'']]']]]'{{[`''{{{]'''{{']'['{'{{'{{]]]]]]'`[[`[[]'']]]'])[][[')TERPKTIBBkxkxK!)[[RKHBxB^[)!^!^^TKJxzWEYLzNKxyhh8hijiaVkdkVVkpapaN!^[^!^_RRR)RERYWYLxg7-::;9vghhcxxchhcclzL_{{''`]''){{`'']''''''']]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]```]]]`````````````]````]]]'])[`_R}_}ELg.X9ghgc3-,:<<<<<<<<<<<<<<<<::::::::::::::::--------::::::::::::::::::::::::>>>>>>>,:>3,>7fg7fgxW(}}x9+%ichkYER})(WWxclFHBc 1<..6<-,<,,33322::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>::::<<<<<<<<:<<<<<<<:,---->3>,::::,,,::::::::<;,>-335>>><;;;;::::::::::::::::44444222222>>2>>;;;;;;;<----<<<-;;;;;>,,>>>3>---..--->23>31X9cR{`''`)]''}))W7-374::33::444444::4+hNLLKKJIYYIIPIIIYYYERREWIYIETTIERRRRRRR}REYWKKKKJHBBHHLHHHJJHBnHHBzzHHz|||||||HSSSzzzzzzzzzHHHLKJKYYEREEYWLHLKKYER(RR(_)))))))`)___))_)))))__^^^^^^^^____))))))`))))________)))))))````````````",
+"__)__))`))))))))))))))))```````]``[))[[`]`````]]```[[[[[``````[[````````))))))))```[[````]]]]]]]```]]]]]'']]]```['][]`['`]]]]]''{']`[[````]'''''{{'''']][[]{{{']'{{{']]'{`_)`'`[[[{{[[{{)]{{)R^[]{{`)))_^RR)`[[')_^[{]}EKTRTJJTTHxcxKT^)]YHBchkkxI)^^^R^RWJLSxh999cg6XXc999xIBxJzxhhihhJ'[)))}RR}YR_}WFWFc3X-33:fxY(}}}!!TYE^]{{`{]`''{{`'[''`{'''']]```]]]]]]]]'''''''''''''''']]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]`]]]]````]]]]]]]]]```````_``))}RRR`Eh.ggfSWgXX>:7<<<<<<<<<<<<<<<<::::::::::::::::--------::::::::::::::::::::::::>>>>>>>,,33:-->3,<-<7gcl9698yihxcxKEWSfX.X9cxLzh76.X.-<,<:,3322:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>:::::<<<<<:::<<<<<<::333333>5::--------,333,,--<,>372>>><;;;;::::::::::::::::4444:22>>>>>>>>><<<<<<:<,<<<<<--:::-::>>>>>>2>>2---,3>233-7fxxFLllllxxlhg9g7;,gcggg3-33-::::4:::.6gxFLWYKWETTTTRRRRRRRRRRRTEETTYIYYEEERREEEERRRREEYYIKKKLLHLHBzzzHHBxxxzzzzSS||HSSzzzzzzxzxxxzzHzxzzzzHHKKKHHHLKYYEEEYWWKWER}___))[[)__[)))))___))))))__))))))))))))))))__)))))))))````````)))))",
+"_____))```````)))))``````]]]]]''``````````````````[[[[[[[[[`[[[[[[[[[[[[))[[[[[[[[[[[[``````]]]]]```````]]]````][][[`[)`)[[[[[[`__^_)[[``))``[)`''``]]]]{']]]]`[`]`[]][[[[]{']'{'[]{'{'[{RIY^]]`E}}EYR)[`[[``)[`[''__]{[{[E!)^TY]^EKKITR]__]RJzichJ[_R___RLc6X117XX37ggffh91hLLllh99hzSL{{'))(()(Wzhclgf7<--33:-X7hlxHLNLI_[_['[))R)])`)`''']`']]'''{{{{]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]']]]]]``]]]]]]]]````````_]`__)__)zhxzxcSSx;,ll--::::::::::::::::::::::::::::::::--------::::::::::::::::::::::::>>>>>>>,>>>>---:,<-.X.69chyyhhxzLWEHf.177-.1yNWLSLWFc7---:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>:::::::<<::::::::::::>---:2>5>::::----7,------;-,3---:>>>><;;;:::::::::::::::::::::::>>>>>>>>>>>>>>:::::------::::::::333332377,-::-:3>-,7g966.XXXXXXX9..X.X773ff,-:3:,:-:333:<--7fgcxLWWYYYWWYYYYERRERRRTTRRRRRTEYYYYEEEEEEYEYYYYEEEEREEEEYYYYYKKLHHHHH|zzxxxSSzzzzxxzzxxzzz|xxzzzzzzzHHLKKYRYYYYYYYWWKKLLLLLER}_RR})_)))[[[[)[[`[[)))))___)))))))))))))))))))))```````))))))",
+"))))))))``````))))))``````]]``]][```````````````````[[``[[[[[[[[[[[[[[[[[[[[````)[[[[[``````````````````[[[````][][)[)__)))))___)_}^__^RRRR)[[[')___)`]]]]``]]']_``[``['{]__[[]][[^^^^[])[)__[[_YR_RRRRR^`'[)`'`_['RJKR)R])^^^!TT!^__^RYE^^^^TPkhy8hlzh96XXX9vv977<;X;lclSzh9hchhhhhlKzcLRRYR_(((Lg...X..-,,--:31171X+6X+9hh9hlxhyyzYR'][]]]```[````````]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]``]]]]]]''']]]]]]]]]]]]]```]''']']_})`[`_Yzchchhhf11777:::::::::::::::::::::::::::::::::--------::::::::::::::::::::::::>>>>>>>,::>>,33,-:,,<<16gxFLLHYERKFl9;;X--79ghh9xWWSg7-<--:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>373>32>3<,,,,<,,--,,73,;<.-,,,33>>>>><;;::::::::::::::::<<<<<<<<<<<<,,;;>>::::::---:,,3,444::::::::::--:XX--372--3,.....XX+69ihhNNllh9.1,,,,;--,,;--;<,,33:--5377ffglDSLWWWWWWYYWKKWYYYYYYYYYYYYYYYYYYYYYYWWWWWWWYYEEERRRRYYYEEYEEEEEEEEYYWWKKKLHHHHLLHLLHLLHLKLLHLKKLKKYYYYYERREYYKYYYEYERRRRR_R}___)))_)))))[[[))))))))))))))_))))))__)))````)````))))",
+"```)))))))``````)))````]```````]```````````````[```[[[``[[[[[[[[[[[[[[[[[[[[````)[[[````[[``````````````))[[[[))[][))_^^[[[[)_^^)_^_[[_R'`[[_RETRRTR^_))_)[``)_()[`']}KBicBITIIPJBNzzkh9L){{)`{{{{{']```_`'`[```]_]{RYR[)`_)'__[[_^^^)^TR[^^[']^W6X1XXXX1XX1991XX.+69yhcBxxBBNNNxNBNkNxkKIKHKWx9191X;<-,7,----,3--7719xHLzHLHLWKLxhzKR])']]'{']']]]''''']]]`````````````````````]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'''''']]]]]]]]]]]]]]]''']`)_RR}RR)[JxzxFllFFRLf-:-::::::::::::::::::::::::::::::::--------::::::::::::::::::::::::>>>>>>>,,>::>>>::::---<<.hSYEYRRRh...,7-3---.X.1777-.-----:-::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2>:>--2222;;;;;;;;7,-XX--;71<<---->>>>>>>>::::::::::::::::<<<<-<<<-<<<<<;;:::::::::::377774444444:::,33,37gcgf-:22>7,..1.18ihhccchcchhhg6ggg9.X..XX....XXX-23322255555237fffgclzLWWWWYYYWWWWWYYYWWKKKYYYYYYYWWYYYYYYEYYWWWWERYYRREEEERRRRRRRRRRRRRR_R(_(R(RERRRRRR_RRRREEEEEEYYYET^^^__REERRRRREEEEERRRRRRRR}}__)))))[````))))))))))))))__)))````)))``````",
+"))`)))))```]]]]]````]]]]`]]]``]]`````````````[))[[)))))[[[[)[[[[[[[[[[[[))[[[[[[)[[```[[[[[[[[``````````)[[[))__)[)_)_^_[))))_^^RRR^)[_!YT^^__)[!!!!^___[[`````)`[)Yh6%99ihhihhhppihlh9 0cLKY)']'[[]][[[)RR[])_][__)]'`}_]`]`_____^RYYR}JJxzJIR[}_RWWLg7-79966hzhcJNI^NKT^][!RTIPBBBNNxK^TEET_}Y((x-X,7---,33,--3><<.6hzzxFWYERR}R})_`{'`[][[']''']]``[[]]]]```[````````````````]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'']]]`))YYYEEKKRxcll9969fglg7X-7::::::::::::::::::::::::--------::::::::::::::::::::::::::::::::>>>>>>>,,>::>>>>34:::::<1;XX9xE)l7.,<-:3:--,,.X;.<-.,7<-:-:-::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>:::>>>>>>->3>,3-;;--;;;;X.;fcFW((_(Ff->7>>>>>>>>::::::::::::::::---<<<-<---<<;--:::::::::::>333,444::::,::,777ffSh6.7hf--;;6.XX9hiihxBzkiiihzcccv999999999hhh9997--,3>-22>>>>>225-5;;.9hFHLKWWWWWWWKKLLLLLLLHzxlhclxFHLLLLKKWWWLKYEEEEEWYYYYYYYYYYYEERTEEEEYEEERRRR}RRRRRRRRR__RRRRREEEEKKIT}^__RRRRRREERRRRRREERRRRRR}_R(}_________________)))))))```)))))))```",
+"))``))))```]]''']]]]]]]]]]'']]]']]`[[[[[)[[[))))))))))))))))))[[))))))))[[))))))[[[[[[)))[[[[[[[[[[[[[[[[[[))____[)_)__[______^!__!!!!TIIT^_^_))^^^)))))`[)`''`_Lh699vcchhhhhch%clh8%+9h8h800hY]})'{{{)!IzzY)[[{`'`)]](YK}ELW`[FhxLERER}Lx6X69hFRER(((WE())(EKKWLFFhlLllzxzKEKxchhhlxxhcylR](ELclg-,7<,-:,,:--:3:---,<XX.69glLR`(({'}'[}})`EY__)]]'']]]]']']]]``]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]']]]]]]]]]]]]]]]]]]]]]]]'']]`)_}YYYEREYRHhyh9966Xgx7.,<-::::::::::::::::::::::::--------::::::::::::::::::::::::::::::::>>>>>>>,::>>,333::433::--,7,..;99,--,:::-:::,--<-,<--<,7:::-:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>X,7X-771,;179fflSW('{{')'`F7X-3>>>>2222::::::::::::::::--<<<<<<-<,,,,:::::::>>>:---;;;-:::--<<<;;;679gh9ghg7.X.7999999chiqqipppphkkBxchhihxzxxzxxxzxxcchg91;.;1<<<,,:--2233-;9cFLKWWLLLlccllllllllch91...177997779gclxxzxxzzzSHHHHLJKYYYYYYYYKKYRER((E(RERRERRRR__RR}_R}}^^}RRR^REEETTRRRRR}}__RRR}}}}}RR}RRRRRRRRRRRRRRRRRRRRRR^^_____)))```))))))))``",
+"`````)))]]`]]]'''''']]]]]''']]]']]`[)))[))))))__)))))))))))))))[)))))))))))))))))[[[[))))))[[[[[[[[[[[[[))))))))_[)____[______}R)___^^!!I^][^))_^^)[[))_)___(Wlf--cWDclcgzLl9666hy++hxlclxxcckzBnHHBJT^^IzkJ^'']__){_xvcWR}RSlW)WLHW_[)_`(c.XXX;+clf97,gL()((YHNlhX-;X1X;;X;1,->X;XXX1XX.7gf,glf---3--7:,---:,:-:7:-<<...117cFWWWxSccWFxgcl7.gggclxLY}`{''''']]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]''']]]]]]]]]]]]]]]]]]]]]]]]]`)_}RRYE['[)RJHJzNc9X.g77;<<::::::::::::::::::::::::--------::::::::::::::::::::::::::::::::>>>>>>>,:>3,>:-:4444:::33-,-<,X<-,,-::::-3:--,,,,<--3,--,::::::,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<:::::>>>>>>>>>>;;;;;;;;6;gchS((EYYR_`'{{'`_(WFDgg9-X,7->>>>2222::::::::::::::::<<<<<<<<,,333333:>>>>>>>,;;;;1;;;.......9999vhlzBxxlhhhxHHhhhciypppaiuapijkzkkhcBJJBzBBzhhhhhhiihch9X...;----<<-4443-;gxFFFScfff,;---;;;1111;..;;-...--...XX;77<.X;6;.gzHHHHHKYYEYYKJHFz9vhhchgfhcLEYLlhHWEYYR}R_^RRR}^R^RRRRRTEEYYYEEETRR^__)))_))_}RRRRRRRRRRRRRRRRRRRRRRRR^__)))```))))))))))",
+"```))````]']``'{''''''']'']`````````````))))))))_____)))__))____[[[)))))[)))))))))____))))))[[[[_)[)_^_)))))___)!^))^!!^^^!RRRR^ET!!TT^^^^YTT!R!^[[_^_)[_`)WgXX12373,,771ff719gg966gcllxzKIBzBBBxki% 0988hcxBJJILxxxh.X.9fhFYWWRR(EWEREYW_x;glf16gFx.X7--hE`(R_}WWh717791;X;7fggFSxDWWWWShg7Xfff3:--::::::::::>>::::<<<--.......;;;;;-------........19hcWWR][]{`'`'{``']]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]`)`]``]`[')'[']}]``]])YNNKBNExl9.X..-<<::::::::,::::-------------------::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>444444444::::::::::::::44:::::::<<<:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<:::::>>33>>;;;-1X.119lSE())`''`{{`_(WLFchf71;.X..;;--;,-:>2>422--::::::----::,,:--:,::-:f3:7>:--:>>>;;,;;;.X.11X999hhhlxxchiihchhihjkxxckjhhkjijjaaapppjjjkkkzBBBnxkhiiijkhiphp99hg6X1;---<<<--4445-,fhcg91;;--332,,>>>--:>,,,,;;;;;;;;;;;;;;;;-797.;hFLLLKKLLKKKLHzzzz9991X-;X.XX99XXXX66XX989zY^RR__R_}^^^__R^TYYTRRTEETTTRR^__))[[[[_^^}^^^RRR^RREEREEERRRRRRR___))`))``````",
+"````````]]]]]''''''''']]']]]]]]``````[[[)))_____________))_____)))))))))))))___)________________[[[))))[____^^__!^^^!!!^)^TTR^^REETTETTEETPTTRRRRRR})'_Y__LfX-71222:-:,3----;77,.9cllcclKKBkkxxkhhhiihxzzxlcchhhclc916hlf1X1ff767cW(RR))ESlfDcSW}R)(WhX,9W_W('[)E(WRRYE`JHHHLW(`{{{'{'['`)(RKl.X--:,3,--:::::::::::::<<<,,<<<;;-:::-----:::::-----<-.;6669L'{]'`'``]'{')]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]````````````]```````]``['{]''[_EIJxxKNy9h77gcf,-::::::::::::--------------------::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>4444444444442222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<<:::>>-->,;;;1669hxE[[[``[[)ELchgf7;XX--X--;;;<<<;---;,,3225:4--::::::::::::::3:::::::fg723:>2,,,;;....11699hhcxchchhxBnzkjaiaaiqqqqqqiajjjjppqipjkkkpaaappipj88qiipphuhjjhhhag9g91X;-<<:<<<--4444:-,7...-;,33-:::::::::::::::::::::::::::::::,17711flFLLLHHHHHHHHHFzxhhhg7177g9766996XX11XXX9zYRHh9hhhhxJKKIY![[RYIEERRRRRRR!RR}^^___[[[[))[[[_}R}REYYYYYEERRR___))``]]]]]```",
+"]]````]]']]]'''''''''']`']]]]']]```[[[[))_________________^}^_______________________)__^______^^_^RR^_^^^^^^^^^^^^^^!!!^TYETYIPH!TTTT!!IJIPTEER})_)`El91797--77-::>>>:--3;-,77,-X6999ghh999%8ii8ihhhhhccxchhiiii999XX9lxg7;;;;;.X1lLSSKLFg;-7cW`()]({{gX1F)`)EW_)`RY^^^T[^^^_)__YET}]]_}]^[Rxg+X-:::::,3:::::::::::::::<,,:<<;;;::::::::33322222-<,<-...6.gLE_{{`]]]']`]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]```````````]````]``]]']][[_``_}RJHHLc9c9X;fcchf-,,,,,,,,;;;;--------------------::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>4444444444444444:::::::>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<<::>>>73;;..69gL_)}}__}(WFcy6.;----;,1;;;,,,<;,,;;;;;;;-->>224--------:,,,,::-:4::::237f3->:>2X..16999v98888iiqiqqiiqpkkjjpauaaaappssspappauaspppjjjpuq*8uu88uuuuuuuqq8uiiiu88g99713732244::::4::23:---;,,----::::::::44::::::::::::::::::::::,--,,179hlxxxzSzzFHzNHHLlhgf1---6fgfgch9ccxLKHLYEREYLzh99XX++XX6cLRRTR^^RR!RRTTTRRR^^^__^_))^^[`[[``[[)[RRRRRRRRRR____))]]]]]]]]",
+"]]]``]]]'''''''''''''']`']]]]]]```[[))))________^^^^^^^^RRRR^___________________^^^__^!R^^^^_____^RR^_^^!!}!!!^^^^!!!RRR)TTIBHYY!EETT!!YTTKEYERE)REWl;X1;;11;;..;;1171;.;;;;.X...1XXX11XX169hhhiyyy999661XXXXXXX6XX.11;X;-3,X-3,1X;6XXXXX9ffX7fglxKLHz9X6XlLcL)LWLlgNE^E!TYIWWYEKFxxKR_)RKWxXX6.<;;----->:::::::::::::::--------::::::::2444:::::,,:<<,11X.669zY)''`'`){]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]``````````]]```]]`][`[]`'')`]))(EEKHzglhccg7-77-<<<<<<<<--------::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>4444444444444444:::::>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<:::>>>---;1666xWR_)RWWxxc9.XX.---;;,;;;;,,,,;;,;-;<,<;;--->322::-------::,,::-:332>>33-3--,;;;66699yhhhhiiiq88qiuuiuqauquapsjksssssspppaauqwwuiiqquaau8*8uiuuuuuuuu888iu888**871;--52424442223:---:,>:,,,,>;,3<<<<<<<<,:::::43::::::::::::::::,---,;;;799999999hzHHHHLg1X.->33...X1gSWKWWYE}__EEER__(RRHxxllxzHY}_}RRYRRRRRRRRRRRRRR}}}___^^_))[`[__)[][[)___________)````]]]]",
+"]]````]]]''''''{'''''']`']]]]``)``[)))))________^^^^}}RR^^^____^}}}}___}__}^____!!^^^!RERRRRR!^_^!RRRRR!RRRRRRR!TTRRRRTTTIR!PKYIEYEEIT!T!TY_RYShggf7-;,>-31--7ghvvhhhhhh6991.699991.X..111666666666611..1;111...1XX1.X;13-37333-1XXXXXX1X19;7-77yXXXXX6+++XX991.f>,;f99v69991;;171111777.17;17>,;;;111,-,>:::::::::::::::>>>>>>>::::::::2:::::::332:--<,7-X.6999Y`{`]']`]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]']``]''`['_`R_REEWWYE}RzhhxFccxSh7-X--:<<<<<<<<--------::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>2222224444444::::>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<:::>>>;16.X+cJKWKLLx99..XX.;<;,,373,----------::-<,,<-,,<>>>>>::-----:---:::::2773>>,;-;1;11..++++98yiiiiiiuuuuiuqqupkkkkkkkjsspaaauqwquuuaaw#=8quuuuqiuquiuuu*88uuiiu8*%%%%*8f971132322>>>>,,<<---:>225->--;1.....<<<----:::,::::::::::::::::3,33,;;;;-;;;..109cxzzzxh7.-----,,,1;;19lFLLHKYWEEEEWWWE((_)RER(EEYEEEEEEEEEYYYYYYYEEEEERRRREEYY)_RR_[[[))))))[[````````````````",
+"]]````]]`'{'']'{'''''']]']]]``))`[[)))__________^^}}RRRRRRRR}RREEEETRRRR}RRRR}}}!!^^^!RTRRTTTRR!TTTTTTTTTTTTTTTTTTT!!!!!!IPIJJPPPIYIPITTIET}Hc9X--::,32->>-;169giiqqiiiihhhqiclczxch91.1...-----;..-;;;>>,--1;.1XX11X-1,,--::::-6999hihlLHc6<<-71zKEEIEIJxcllchh353--XXX111117715-X--;1;1X;----5XXXXX;;1>>>:::::::::::::>>>>>>>>::::::::,,,:::::24332:--X<7,..17cR{')'{`]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'']``]``)_)}_EYKRELzzNLFc9cly661.X.<,77:;;;;;;;;----;;;;:::::::::::::::::::::::::::::::::::::::::::22222>>>>>>>>>>>>>>>>>>>>>>>>22244444::<:<;;;;;;<:<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<::::>>>1;1glzzzxLLxh91..;;,,,,,-----:,,773,---->>>>,<-------->2::---:,,::---:::>33;-;;.1.611616   +%888uuuuuuuuuuappjkBBnkkjpuquqquaaaapjpajkj8uapaiqqqiiuuuuuuiiiut88&8&%%%%%&99+X.XX;;;;;..XXX..-->223223,-..++++......;;;;;;:::::::::::::::::333:->3,--,117f966999991X-,3377-----,1;19cxFHHHFFLWYWLFLKYEYE(((EYYYWWWYWWWWWKKKWWWWYYEEEERRRRRRTEEER^____))[[[``]''''{''']]```",
+"]]````]]]''''''']''''']]']]]]``)`[[))______^^RR^}RRRRRRRTEEEEEYYYYYYEEEYETTEEETRRRRRRRRTRRRRRRRR!!!!!!!^TTTTTTTTTTTTTT!!TET!TIJBJJJJHJIIEREK9X177:-4:-:77--,119hauuuuuaaauquajjhiihcchgf;17323447,>3334337::f7-7xFWWWFh>>324347fcclxzzNBcJLL9f,fK}RR]!PY![^RRWc7,-.19zLWWYYYLl9X79hxxxlh99FYLxlghhg91..->>>:::44::::::>>>>>>>>-;<<<,,,,,,,,,,,<<442333::7,.X-67f6lR```'']]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]']````)RRELWKWHzlchhhcxxhlh9hh.1.17;X-3-;;;;;;;;--;;>>>>:::::::::::::::::::::::::::::::::::::::::::22222>>>>>>>>>>>>>>>>>>>>>>>>>>222444<<:;;;;;;;;;;:<<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<::::>>>.7hcchkNHxh9111;;,,>--:333,::::,-----:,322>>-;<,<,1,-->3::--:,,,3,,:--::-;;.;77696999998hiiiiiuq*wuuaaaauuapaiaaiiuquuipiiuuuuuukkjphkkhiapiiiapiiiuuuuu888&&%%%yiiiyy8888%+996999999+++.+6<;,34442331798899%+++111111;.>>>>>>>>>>>>>>>>:232::>,3,,>-->398yyhy96..,,--4:33,-,7,-;XX19gghgghg91;11117glSSSSFLLLLLSzxxzxxxllllxxxxFLWWYER(}^^RET})____))))))``]'''''''']``",
+"']]``]]'']''''']]]''''']]]]]']```[)))____^^RRRRRRRRRRRRREYYYYEYYEEYEEEYYIYEYKKYTYYYYEETEETTR!!RRTTTRR!!!!!!RTTTTETTTIIETT!!!TPJIEIIIIYTIIEREh71;::::434--77-;9gguuuuuuuuuuuppaaappaiy8vggccf4444:--54444-347llggzzFHFxg,23--4:3gyhxBkckhhyyh969gERRIIPBJPJLLl1X3..hKYRPYIPBp%%iclzKYHNHBccxxK}``)``ESg7;;>>:::44::::::>>22>>>>;;;;;<<<<<<<;;;;;;34455:::--<,,.X69+cR{]`]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]`)`)_EKLhxcHlllchhhyggh9.616X;6X.33:::;;;;;;;;;;;>>>>,:::::::::::::::::::::::::::::::::::::::::::22222>>>>>>>>>>>>>>>>;;;>>>>>>>>22224<<<;;;;;;;;;;<<<:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>f9glNzkhl9.1.X.;1>->3345:::::::::,,,:---22>--;17fff7,-:,::--:,33773,--::;1;;7ghhhyhhhhhhiiiiiaauuaaaauuuituiuiiiiuiiiuiiqiiiiiiiqiiiiiiiiaaiiiiqiiiuq8*=&%%%&88y8iiiiiiiai*&yy8yhhhhiytty961->24342>-X6gyy8889996666611.>>>>>>>>>>>>>>>>::2233,>-33>>377+999999g61;-:334::,,--;1;;1;XXX..XXX.11;..;1..11X.;17ff7;;;1111;---;;;;..69fgghcxxxNJYTRETRR^___))````]''''''']]",
+"']]''`]{'''''']]'{{''''`{[{{`''`[``)___R!!!RRR!!!TIYTTTT!TTTTTTTETEETEYETYIIYEYITYYETT!ETTTTTTT!TTTTTTTTTTTTTTTT!TYITTTIIYT!!!TTITTEER}R(WcSx57>33::::3,1.XX9iiiuaaauuiiaq8hhhhv88*wwuuaujjw%8ii88900hchi% %xJxzjjjkh.;-3-.9xKcO69ijjdddds8ily+yzkxzLxhzLLlf--,-X9}TJUPCPz0Xglhchjknbkkkkky+9yhBxxzzLWx7--37-:34-,-34:744:::,,;;::::::::<<<:<<<<::::::::::::::::699iH^'{][[]`[]'']`]'']`]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]''']]```]]]`[)}}YNzFFFclg9cxlh88gf-,-:::22::::-----:::::::::::::,,,::--:::,,::::::::::::::::::::::::::::::::::::::::::::::::::::>>>:::::::::::::----<<<<<<<:::::,,,<<<<<-,<-,,<--,,--<<-<----...222222222>>>>>>>--<<::4444::<<--:::::<<<<<<<<<<<::,<;69yxzBHBzc93444444::::<<---...;;;>>:4433444455;199888899++.5>77796X1;;;11.X996XX6yhiiiqqaaqiiaaiuuuauuuuuuuuuuuuuuuuuuuuuuuiiuuuuuuiiiiiiiuuuuiiuuuuuut**88wuuuuuw**wuuuuuuqqwqquqqqquuuuuuuuuuu8*====**===88**===*8*==%%##3,:33:--2::::4::444444444442---.X+6.X..X........;;;;;,,>-4334444................,,:-----:----...;;;;;;;;-------------,fczFWR}}}_[)`]```)])`'`]][",
+"`'']`]]]''''''''{{''']]]{`[[`]``)_)[)}})}}!!RRTTIIIITTTETTRRRRR}ETTTREIITEYYEEEEYIT!TYYYI!_!TTTY!!!!TTT!!!TTTTTTYTRTEYERYYYYETEEIHHIEWLKHS971X7>::::::::<;198iiqaauuaaaiiihh8%69uuuuuaaakjaupkkjchhiqhchxkh%izxxjjjkhX;223,7hxxhhhcjdddjpj89hh++ixBhhh1X777-X-33gL_^PZVVVk0XczlcjjjskbVkBxi%9% +%9ixKKSchg;X33-7,,3:-:-444::,;;;::::::::<<<::::<::::::::::::::::X9999izI^{{_'{[``]''']]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]```````)))[``[)(RRYHFFlc9yhhhhhlf,-,3::22::::-----:::::::::::::----::,,3,,:--:,::::::::::::::::::::::::::::::::::::::::::::::::>>>:::::::::::::---<<<<<<<::::::<<<<<<<<-,-----,-----<,,<<<<<---2222>>>>>>>>>>>>-<<<::4444::<<<-::::::<<<<<<<<<<:--..19hhkBBxi9%444444:::::<<<<<.;;;;<>>32:225:22>>798iqq88yyy99>;;..999XX.11166.+.XX68iiiapiuuquiiaiaaauuuuuuuuuuuuuuu8uuuuuuuuuuuuuuuuuuuuuuuuuuuut888*888888twwuuuuwwuuuuuuuuuuuuuuuuuuuuqqqq8uuuuuuuu8uiiuuiuuuq8**8u8888=%#,---::,,,,::::::::4444444423777698y9999999999766X.;;;;;;,,::::44----<<<<<<<<<<<<----:::3::------<<<<<<<<,<<;;---::::--<79fgghhccccglR[_]`']``)`{",
+")]`__`{{]]'''''''``]]]]][{{'{[_`'''`)_}_RRRRTEEYIIKKE_RERRREEYYYRRYYEEERYYEEEYYEYIETYERR}EYETTRRTRRREYEEYYETRRRRRYKWYKLHcchcxzSSv1X9v917;7;->37-::44444:-,79hhhhauuuaaaajpi80 9hiiuuuuuupaasjjpphihhhhkkhch%%hkkkjphh122544:-779fghhjjkkjkchh966%xKxi9.6X;<;--::x^YTPVVZCVi %999qhkkkVkpjhiycchicxxLRRR})Wlg7---;.,-77-4:::--;;;::::::::::<<::::::::::::::::::::XX698hhhKER){])]`]'']]]']]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]````````''][_R})R_WWKLFhWFxc88icc,7.,3::22::::----::::::::::::::::::,,,,,,::-:::,,,,,,,,::::::::::::::::::::::::::::::::::::::::>>::::::::::::::<<<<:::::::::>>><<---<::-<:,:-<,>--::---<<<<<<<<>>>>>>>>>>>>>>>><<<<::::::::<<<<::::::::<<<<<<<<,<<169hchckxc8 X>,,,,:-->>>>>>>><:::::::3:::,,::--19hhiiiuqiii9+;...+9y9699998ihhy99++o %%8iiquauiiiaaaauuuqwwwwuuuuuuuuuuuuuuuuuuuuuuuuu88*8888t88*****===*8uuuuuuuuuaaaauwwuuuiuuuuuuuuuuqqq88tttttuuuiuuiiuuuquuuqquuiuquu8%01<;;;--<;;<;--;<----->>>>--17999yihi8yyyyyyy99999999999961..-<--:::44433:::::>>>--:::::::::::--->>>>>>>>222222223::33:----.XXX.;X1;XfL)'`'')[{{[",
+"]'{']]]`]]]'''''{{{{'][[)'`))[`_HxhhH_)ERREEEYYYYWWYR(EWWLHLWYWLKWYEREWWWYYEEYYIEYYYYEEKYYER(EYYER(((RRRYYWWWKLLWl7;11.XXXXX;;--;;..;;;;;-,,33::>2444444:>179vhhaaapppppku   9yhhiiiiiaauajkjuqaiuihjjjkjjji8ihjkjaihhf2334445---169hkxzxlxlv6998ipi80XX.;;,:::3K[IPZVZZZVa#8iiiikVCVVVkkxchhhihikxBIYKYLK(Yc97.1..XX-X3::<<-;;;::::::::::::::::::::::::::::::::6699hclchizEYE```]']]`]']]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]])_}_}WNllFzFWLLEYHzNzxi%f<<-,-33::::::::::::::::::::::::,,,:::::---,,,--:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>::----:::-:3,---;-;,3:-:::::::::::::::::::::::::<<::::::::::::<<::::::::::::::::;1699yhckhiipq% ;..;;<<;<<>>>>>>4444444::::<<-....69iiiuauuuu8% 16998yy88yiiyiiphhiy89%%  %888iaiuuiaauuuuuqqquuuuuuuuuuuuuuuuuu8888888888***8888*==%===88uuiaaiaaaaaappauu***uuaiuuq88*uuuqq8888888tttttttt88**888uuuipiuqui8=#;;;11...6611.........;;;1;XX+998tuit88ty88888899yyyyy89966.....X4444444422222222,<:::::44444::::2222222244442222,:-:33333>>2>>>53-23X1S`'){{_)'^",
+"RKzHY^[']]]]]'''`{{'`]]`[[_)^[Rh..XX1xE((RREEEEEEERRWlg91.X;7971XX9hxHHKKKKKWWYYKWWKKWx6cLYLHWRE(EWFxcgfff773>---X-,73-:333332::-37--:3,7-,:---7>>>244444>>-;;11iihhhiiiy+XX669998888qqqquaaaaaajjjpjpppkpapaupjsspihcg7>>2377343<..9hclh99f99y9apiqih891.--::37xJIUUVVVVPCjq==ujjkkkkVPVBzxxxxNzBkhkkkxxzccFHc9cxllg77,--<<-;;<>>::::::::::::::::::::::::::::::X.9h999+++hchF}_''```]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'']]]]]][`'[RWLHxhhlHHllFlhhcxxccc<,--3::::::::::::::::::::::::::-------,,:::::---------::::::::::::::::::::::::::::::::::::::::::::::::::::::::44444::::>>>>>>>;;;;;;;;,--<-;;-;--;,,,3:::44444<<<<<<<<<<<<<<<<:::::::<<:::::::::::::::::::::::..69998iiiiu888%..XX.<<<;<>>22224444444::,<-...699yiiaaaauuuu*o 99iittiiiiiiuttu888yiiiut88=%8iuuuuuiuu8uuuuuuuu8uuuuuuu88888888***888**888888**=====*8qaphhpppaaaiuuuuuuu8***quiiuu88**88888888**8tuuuu**88uiiaaaiiuiappiuiii88.XX..X.199966+..++++++66+++++%&8ee*******8888888u88888&%%%++++XX>>>>>>>555555555;;--->23444444444444444444444444,,:--:222222322443427-3S{)_{{{[]",
+"88888iJ'']]]]]''{{'`[`]][)['^_E9X,71X;cLWWLLLLKWLWWWl1X;;;11....66669hhlHzzxzHLKLKKLKWx1X691.fclgf73,>--::::54333344:-:7:4444437344333,---,<<7<<;;>>>22222>>---;69999616..;1;-279998iiiaapppsjkjpjjppsppaaquaaauwupq8i89X.---52333-.;7997;;;1hlg8aiiihcc11;>:44499ciuukkkbkpau**hquauujkxkhhiiiitiajxkjkhcxlxNNzHLLWHcg;.<<<-..;>>>:::::::::::::::::::::::::::::7;XXXX1X9999glK]']```]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]````_`]_EYYYxlERFFc919hchhxxWW7<::7-::::::::::::::--::::::::---:,,,,77:---:,--------::::::::::::::::::::::::::::::::::::::::::::::::::>>222244444:>>>>>>>;;;...;;1117111X171611..-;:>>:44444<<<<<<<<<<<:::::44:::<<<<<<:::44::::::::::::::::;..11++%8ihhihi8966...;.;>>>22244444444:-<-..6ygyyiiuuaauuuuu8&%98yueeuuaiiiuuue8888ttttiu8#o*ut888quuuquuuuuuuu8888888*==========*****===****====*88uiaapppaiiiuuuuuq88888888888888************=**8888*=*88uippppaiuuiaiuqiiiuu961XXX+689999988&%%%%%%%+%88&&**ee*************8u******&***&%%++.;;111111111111161;;;>>:244444442222222222222222-,,:-:::24444444434523>1R{'}'Tck",
+"^TT^]]]]{']]]]'{{`)'{][`[[_)R_`H---,,--,711111111777;XX6X166616969998999hhhhhhclNzzxzLHl6XX.1XXX1<---<,>33222444:::4344:333444444--43:--,7<...<..;113,>>>223,,11;;11;-X-->22554fghhhhhjjjkkkkkkkupaupppsajaaauuuuwuw*u*8&996X.;;-37,;;;-;;1;Xhxlji*iiii9X.;--444X6ckjjpajjjjiwupiqipaau8q888888*aiiphjkkxhkxczJHKBLWLHLxcchg96<;>>>>>:::::::::::::::::::::::::::X<111.6966+6969F````]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]`[[[[][__]`Wl9hHKFHx9.1X98hxcFEg.3,:::::::::::::::---::::::::::,,,,3373---:::--------:::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>2::2>>>>>;;;;;;;.111666996699.9g99996661.;>>22444<<<<<:::::::::::444::<<--<<::444>>>>2222>>>>><<<,;-..XXX998hhh89f9971.--;>>>>>22444444::--..69ghyyuutwuuwuuuu88*+%8teee***88****888tuttu8&%#o%tt88888888888888888888****===%%%%%===***=====*88**qqquuiiiuuuuuuuquuuq8888*88q88******==**************===&*****8ttuuuu88uu888quuuqy899%+%988*8tyuy*&&&&&&&&*******e******************===**t888****%%%%%%99888ii888999661;->2244444>>>>>>>>2222>>>>-:,,>,2>3222222375475-;17R{]]RKY",
+"{{{{{{']{{']]''{LxS({{{{'{)''_Rx-:::-,,-<;;;;;;;.XXX.16.9999999%99%%89%8%%99%%98y89%%yhhy96661XXXX.....---->,>>>:33::334::443344:::--<,1.1.16.6.X166761;;;----;-2222>23374444444.11+%%%%=%0 0#=*uaaupaupuswwaujVkwwwuu*teui8&6+.,7f7:>>21;11X9hcppuiiihi8v91,344.619hchhiiihhpuuhipiuiauiihi888*8ihiikzkkkcBKBhhi8LINHKW}RWFc96.,,,>>>::::::::::::::::::::::::::<7-.699hhhllhgy9)`]'']'']]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]`[[[)_[_YKKzh9Hzch99v16X1+69+gFhX7:-3:::::::::::::---::::::::------:::---,,--::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>;;;;......XX++%99988+%y8+9h99yhhgh96;;;>>>>>::::::::::::::::44:::<----<:::44>>>>>222>>>><;;;::-<,1;..XX11.167777,;,7;;;;;;;;>>>>>><<,<..6999y888**wuaauuu888+o%**eu***88**ewuuuuu**88&**#o&tuut88*88888*****88888***8*******===***==**88uuuuiiiiuq88q8*quiiuuuu888uu**888**=****&&*********&=====**8***&=*8*8888**==**88ut88y8yiyyiiit*****&********8*===**w**e**=**********=*ww**wuuut88888*********tuuuuw*88999961;;>,::::;;;;;;;;;;;;;;;-<,>--,;--;;,;;;;-7;X11X1X9H)]]{'",
+"```]'{{{'{'{[]{zX1X1lLHcxxxxxc9X4:::::-:--;<;;;;++699998888**888888*&********&&&==88uu888y88999996+++669661....;1,<--;<,,3,<:>>---<<......++++++  +99991...6776.>33>-;-->>224444X199hhhhajkjiq8quuauuuuuaaauwwww*wuuuweeeettytyyg--<-73-;16XX8hhuuuuqqii8891;>>-<-.X.X+9g99vh8&tqiq8qui8888888ip++98iiiii8hH[{'RIxhiclHKNLLzcxxg7,-,,-;3-:::-:33::::::::::::::::,<-<9ghcg969lcchz{_`{``']]]]]]]]]]]]]]]]]]]]]''']]]]]]]]]'']``]'[`]][[[``[[)RLxcxhcFHW}}(RYLzlhh,<--:,::::::::--::::::::::::::::::::::::---:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>->,,,>;;1;.1611+++++%9%o%*yi8%ihhit8&%&&&&96++..111<;;<<<:::,,-:::22::332:----<--:::43;;>>>2>>3>--;<<<4444:>>;,;;;;--.5>>>;37fff96;.;;.....;;;;11.X.6f88888uuuuuu888*%%9y8****=8888qw***wuuu8*8*%#%&8t888*88**8*%=*8uuuuuuuuu8uuu88888**8888uuuiiaaphjjpiuqq88*8quuuuuuuuuuuuuu888**==&&&&&&**&******&====********====***=%%=8888t888u8888uit8=**eeeee***ttt8888tuuuuuwwee****w******=====*wuuuuuuuuuute*****=*ewww***88*9899...1;;-;-....XX...11.X.6971;-;11161.XXXXXXXX.XXXXXvzY_)_)",
+"[[]'''''{{]{{'_l117;X-;---XX-;--4:::33,,,111...1=88888888*****eett8888*************quuuuquuq8888iiy888yyhhy996++.......;X...;11;166666666%%%%+  %%%&8899+XX1999..169999911..----X6vcxxcppjjhaiiiaaaauuuuww******888q8******tttyyg.<7--;1fhhy+o8tiiippi88996611;;:<..<.XX-;;19998888==%% %01999%o96698iiii88ilHYTT^RxhhkhHHHHzhyy7,-;,,;-,,,333:-::::::::::::::::-::7fhlzWHh9+.669E{'``'`]]]]]]]]]]]]]]]]]]]]'''']]]]]]]]]]]]```][[[[]]]]```]`)_}RE){])_ER((RLlg9,<--:,::::::::--::::::::::::::::::::::::---:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<,,;;11;;XX..X+6++%%&&&*88&&&8t*&&8u8***&&%%%%+++++6666.X--------,,,,>>::::::-<<<<--:,::3;;;;>>>>--;;;..X44444233--;<<<<-22255;,777766999+++++1...;...19g98888888888*88%0X68t8**8uiq888uu**uuuut888*&&&&&**==****&*8tuu88***888uu888***88***888uuuiiiaappaiuq88**88qquuuuuuuuuuuu8888****&&&&&*******************==========%%%==*88888*88888888*=***********8tuuuuuuuuuuuuuuuuuuu*******=====**quuuuuuuuqe*****************==88%+XXXXX..+++++XXXXXXX+6999gf1.199ghyy8888t88889999xJER__^^",
+"___^^_)`]]_]'{{_fX;7>>-23333>>,344::::--..;.XX1688q8**wwwwwwwwwwttee****************wwuuqq8888qu*888uuuu8888888899999+XXX.+6699966666%%%%%%%%%%%*&&&888899999996%98yihhhy89%+++XXXX%8ihhiiiuiii8uuuuuuuipaiq8***999988iit88yy9999.77<<79hhhhu8t88##8i8==q898v977-,1<..-,-3,-6vhiiiiii899+XX66++%hg99989%88iy88hh8hkiihkccJIJKNhhf71-----;--:33,::::::::::::::::::3:<167gcc96X+9yhL{)){{)]]]]]]]]]]]]]]]]]]]]'''']]]]]]]]]]``````'[__``[_[```[```{'`)_(EWWFc91.XX,<--:,::::::::--::::::::::::::::::::::::---::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<;;;;;;1;..++++++%%988ttttte*&&&*&$#&&$$$$#O###%%%&%&9996++111111;;;;;;;,,,--;;<<<<<;;<<;-<.;;;;,,,-,79976.444:::::--:<<---2222>;;;..1+99yyttt8999611.XX.16%9888888****==% X69y8&&**8888uu8**8ttt888ttt8*&%==&%&&**&&****&%=====88u888**888****88uuuuuuuuiiuu88888**888qqq888uuuuuu8888*********&&&********8****&&&&&&&&&&&%###%&&&*88**88*8888****e**=======**88uuuuuuuuqwuuuuuuuu8******======***q88888**====******==***======*%+%%%%998yyyyyy8888999889%61116998iitttttuuutuiiiihkxxBKT_",
+"^^RRR^_)_`_`'`{{(h;>72-2-2332:::344::--,;1111699wwwwwwwu*wwwwwww********=************wwww8******==**wuuq======**888888%%%%998889%%%%%%  %%%%%===&&&&****88y88998tuuuuappppauut8%++   %%%%   &yii88uuyyiihi88%%%%116999888899999969hg9ggghttuahi8%  %888qq888896+7gg96<-<:3--6vhiiihhhiih91.1669hg969yyy999889999i88qiqqiiJINzzc9776<..<,;---::,3:::::::::::::::::3:-;.X1XXXXXX698z]{'``']]]]]]]]]]]]]]]]]]]''''']]]]]]]]]``````)R_`]`[`'}_))`'])__RR))WLhf;X.<1<<<<<:,::::::::::::::::::::::::::::::::::---::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<;;;;1111.+++%+%&%8tttt***$&&&*&&$&&$#O#O OO###%&*&&%%%%%%9999996611;;;;;;.;;<<<;;,,;;;-..X...;;<,,7ggg96+-----<<,7761<<<.;;;;;;.XXXX +8yyttttyy8999666.XX o%988888888*=% XX+%%  o%%%98888*********8ttt8&&&&&%%%&*utt88**8===%=*888888888u8888888u8uu88888q888888*==******8888888888888888****====********8***&&&&&&&&&&&%####%&&&&*&%8ii888tt**tu***=========***88888quuq888888**888888**======***==%%%%%&&%%%%%%*=%%========$=%%&%%&8tyytuiiiuuiuttuiit896XXX+98888eewwwe**euuiiiii8ihlz",
+"ihxJETIK}^R_`__){Yf-3>27222243334:33,,7fgg998888uuuuuuuuwwwuwwww**uuuutt**tuuuuuuuuuwwwww8******==***===q8*******8888888*88888% o#%%%%##===%%%%%##%&%%%%=%%=8tttaaueeuaapauuuau8iihhhhhh88%+%988888899999%%%%%%%9996616066666966.696.6668tt*&88%++++%8qqqqq8889+8hhhhg6X<:-.9hiiiiihiiyh9..7ffgg97<69yy8999999yy8yiq8uiphjzzkccy11..;;;;<<<,<--,:::::::::::::::::4::1;X.1.+++X99zR`{'`)']]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]`))``)){_YWE}))R((R((RWWWLSSl7;XX<,,<<<<<<<,,::::::::::::::::::::::::::::::::::---:::::::::::::::::::::::::::::::::::::::::::::::::::::333,,,,<11166+++  %89*8&**88**=$#$&***&&#######O####OooOooooo@%%999999999966.XXX...;;;::>>,<<166.......;16996+XX...<6669996666666666699%++oo@&88***tt8888888889%   o%*8*888**88%1XX+%&&889%  %88=***==************&&%%&&ttuy88%%========888*8888888888888888*******=**==========***8888888888888****====***********&&&&&&&&&&&%%##%&&&&*&&%#*iit**tt**tu***=====**====**8qq8qiii888888*=*********=&&&&&&=%%%%%%%999&%%%%%%%%%%%*====%=%%%%%&*88*****888uuuuuiiuuhi8*%=88**wuuuuwuuewutuuihpii888",
+"at88hxJPITR^))[]({S61;>-324::::::433;;79hhyiiiy88888888***uu**tu88uuuuuu88888888quuuq8**********========*====**8t8****8t*8***=#   o#%%%====%%%%%%%%########%=8tuuaauuaaapau**uuq%&*88iphhi8% +++++++++++X++9999999999%%+X.......++6611+98tu*#&90X++%&8uwwuuquai88uuihh967779vhiiiiiii8996<<7fffggf779yyyyyiyy99998888quipikzxBJJlg6...XX..-,,--,:::::::::::::::::2:;,.XX1+99y9hxR{'`){``]]]]]]]]]]]]]]]]]]]]]]]`]]]]]]]]```))))))RWLLWERREWLFzlh696X.XX-33,------<<<,:::22::::::::::::::::::::::::::::::---:::::::::::::::::::::::::::::::::::::::::::::::::::::333,,,<<111+++++%%8iyt88%&&=*=$#%%%%%%%&#####%%%#####ooooo####OO%&&&&*898899%+++X...-;>2:>,<169996661.....XXXX +66999999%%%%&98888888ytt%&&&&**&==***8888888yutt9%++&8888**=*88896X+8yiiy890 %=8=*******8*******88*&%#%%&&%%%+++========****8888********8888*****======%====********888888888888******==********&&&&&&&&&&&&&%%##%=*&&&*&&%#&tu8********==***=====******uuu88uuu88888*&&&=======&&&&&&&&&%%%%%%%%&&&%%%%o%%%#%%*==*====%===******8***88uuuuu88888uiiu8**=*quuuuwauuuuuuaapauiiui",
+"ut**88**kBITT^^^E_F1X<73--:4333:34::-..166%988888888888*=*88888tqq888888*******=*****==*&%$$&&&&===*****===%%###OOO##=********#    o##%%%%%%%%%&%%#####00===##=88quuuaaappi88qqq888888*=#%o XXX.XXXX.1661..66966$&&*88889996++++6.6666+8t*&*tu8+6998uiauwwwwuuiuapauu*+69f998qquiiiy89966777777ff77yghhhtyiy88yhh89iipipajkkxBKIRLlhg9676..;,<<,::::::::::::::::-::,111669999+98hK'')``]]]]]]]]]]]]]]]]]]]``````]]]]]]]]````))))R`{Rx99hgf971;XXX;1<<<,73:--,33:--<,,:::22::::::::::::::::::::::::::::::---:::::::::::::::::::::::::::::::::::::::::::::::::::::44:::<;;...+++%%y8iiy88*%%#%%%%#%%oooo#%%%%%#o#%%%%%%%%%#%%%%########$&&&****&&&+++.;>2222>;16999996+1...X..++&98888*&%%##%&&***&&&&&&&&&*e****&******8888******88&98888&&&&*8*=6XX %88*&889%%%&&8888**8***********&#o#%&%oo%&88*=======**88888****88*****8******====**************8888888888888****************&&&&&&&&&&&&%%%%%%&&&&&&*%#%*888**************=====******uuq*888**8**==&%&&&&&&=&&&&&**&&&&&&%%%%%&&%%%%##%%%&&*****888=========********=***88uu******uuuuiaaaiuquuiiipjzxjiq88u",
+"eeettttt*8iixT^^RRWh.;.,333::-::3::>,;.XXX o%=8u8888yy88&888888uuuq88888========%==&%%&&&%%#&&&&%%%%%%##%%==**==$$#####$$$$$==# #####o###%%%%%%%%%%%%%0 #00o####=8888qqq8qqq8qq8t*==*888*89969669999999996116999rrr****8tyy999yy9yhggg9yt$$euy90y99yi8*wwwwuuquuauwua8++6yv98quuqiiiii99777777<<777gcchy&eyiiyyyii98=i88qpjjkxnIEWWYLlhcg9<;<<-<:::::::::::::::::33;;X.699+9%99%9h_`)]`]]]]]]]]]]]]]]]]]````````]]]]]]]]````))))_Kc961XX.XX;;-;1<..-,,--::33::::--<,,:::22::::::::::::::::::::::::::::::---:::::::::::::::::::::::::::::::::::::::::::::::::::::::::-;;...+++%88898i8*8&%%###%##%%%%%%++++%%+++%%%%%%%%o%#oOO##&$####$&&&&**8***99661>2442>..69996++..X.1669999&&&&*===#==*****&$$&*&&&&&***&***=====******tue**988888&&**&&**=#.XX %8t*888%  #%&8888**8==******&**&#oo#  o%8yyy888*=====*8888*==*888888==*******&%%&*********88*8888888888888888888888***********&&&&&&&&%%%%%%%%%%&*&&&%%&8888****************===*****=uau**8********=%&===$==*&&&*********&&%$&&&&&&&$$#$=***8888888*88**==****888*******88wq*uppauuuuuiiiqqqquiiiajkjkjaiuuu",
+"uwwwwwwuww**wjVU)(EWl7X1;52332>54444444442>-.19g9998888*%%%%9999*&&**8**8&#####o#oo#%&&&&%%###%%ooooo@%%%%%%#@@@###%%%%##o#&88&o#####%%%%##%%&&%###%%%##oo#%%%%%##=*899988888****888888888t88888888888888888%o%88*====**88********we***uuuuuuu8*8qqqqqqqqqqquq88vvqqiit8&*t88888**8uiyyy9777773,6++9yiy999977999**tuut88yyyiiphp^^!^`!Hzch699X1.---,,--,,,,,,,,,444,;.+9yii88888=x^`]{['''']]]]]''''']]]'][_)]][][[[[`]'])_]`_[)WfX---,::::::------<<<<<,,<;;;;.:::444443-:3-7::22325223>,,,<<-.,,,,,,,,::::::::::::::::::::::::2222222222222222::::::>>>>>>>>>>32>,1.XX o%#8pi*ihhy&&&%########%%%#oOOOOOO@@@@@##%%%%%%%+oo++++%%#######$$$$&&&$$&&611;;5;11699%+      &&**&$$$&$$$$$$$&&&&&&&&&&&$$$&&&*******$&***&**88t88888*=&=**8t*8888%    %*88*****=##=*$$$$$&&&&***&&&&&&&&%%#oo%&**&&&&&&&&&&&&&&&***&&&*********&&&&&*&&&&&&&*******&***************8*****************&&&&&&&%&&&&%##%&**&&&&=%%%=*88888*****=******=*===***=8quuipi*88=======**==***====*********&&&&&&&&&***=====****=**88*88***=**888888**888**8ww*wuuaauuuaauuuwwuuuiihhhiaauuuua",
+"w**uuuuuuuuaaa*=hhczzc9.1;;--;,,-::::::2>>;;..1+%%%%%%&&&&&%&&%%&&&&%%%%##o#%%%####%&&&&%%%%%%%%ooo@@oooooooo@%%%%%%%###ooo%*8%o%%%%####%%##%%%#%%####%%#%%%%%%%%==89996+++%%===88888888**888888888888888888=%%888*==***8******8*****tuuuuuuu88*8qqqqqqqiiiuuuqqvq888888i8*yi888ut88999f777,373,666666+..<,<-<9fauupa8&8yyyyyyyyihzI)[Izxxh9v9v9f7--:--,,,,,,,,,44:,;X+988*&*88=hxR{`]']''']]]]]''''']]]`))``))]^[]]`[_}}[__))RLf--7:-,-:::::-----<<<:<<-;;;;...--,,:-43447:-,,<>5-->3>->;---<,,,,,,,,,,::::::::::::::::::::::::2222222222222222::::::>>>>>>>>>>2>>,;.++y8&%8ipi8iy&%%%o########%%%oooOO#@O@@@oo##%%%%#++o   o+o+++%%#$$####$&&&&&&%+1;;1;;.1166%%+o  oo%&&&&$$$$$##$$$$$$&&&&&&&&$$$$&&$&&*&&&&t*&&&*tttt8888**&%%&%%%%&&&%#    %=8888*8***$#=***&$##OO$&&&$#$&%%%%%#oo%%%%#oo#&&&&&**&&&&&&&**&&**********&&&&**********************88*****888***************&&&&&&&&&&&**&&%#%&&&&&&*==%%=888*****===******==8****8**=88qippi88*==***=**====%========********&&&&&&=**************8******====&&****8*8888wqqqwquuuuuuaaauuuuuwuuuiiiiiaauwwuu",
+"iiiiiuuipaappa*  =888yii996..;11,,,;--;1;1166+XX    oo%%%%&&&*88***&###%o##%%%##%%%&&&%%########oo@%%#oooooooo%%%%&%%#o####%88&%%%%%%%%%%%%%%%%#%%####%%%%%%%%%%%%%%++..1++6998*%%&&&&**&***&%%%8888888y88888%%888888*88===**********tt8uuu88888qqqq8qqquuuqqqq8qq888888i8%999889988961X1,<<<<,,3371<..--<3377ghutupi% o888888889998lKYHlhxKFzLzgf:--:-:,,,,,,,,4::,;..6%9888888%0x[`){'''']]]]]'''']]]]`[))`'`)])RYE}RWERE_)Wh1--,7--3,::::::--<<<<::<<,,1<;.16;.X.,7,-<X,X<XX..111..111,;-::,,,,,,,,,,::::::::::::::::::::::::2222222222222222::::::::>>>>>>>>2>;.X+9hciyiit88&&%%#%#o########+%%+oooo##oOoooo###oooooo       ++++o+++%%%%%%&&&%%+1..;111XX ++%%%%%%%%%%&$$#######$$$####$$$$$####$$$&$&&&$$$$$$&*ttt***&%%%%%###%%#####o   o%=*88888888**=%=*8**&&$###$$$#O#$%%%%##ooooooo%&&&&&&&&&&*&&&&&&*&&&*******************&&********8****888888888888*******&&&&&&&&&&&&&&&&&&***&%%%%&&&&***=%%=88q888****==*******8*******8888qiaa88******=****88***====&&==******&***&&==******==*******=******===*******8888quuuuuuwquuuuuuuwwwuuuaiqquuuuaaaaap",
+"89&88yiiiiiiiiii=eeeeuaihiy961<;;;....1+69998&+    oo%&&&&&****8***&%%%&#%%%%###&&&%%#o ######oooo#%%%##%#ooooo#%&*&%##%###%**&%%%%%%%%%%%%%%#%%#%%%%%%%%%%%%%#%o++++......++++  o#%%%%%&&&%%%%%88888888888888=8888888**===******===****888888888qq888qqqqqq8888888888889890X69999961;;-;;<<--<<7773<<<73,37gggyuipjh8%%9999999%++99hlxhzlKRHlc9f7--,,--:::::::::::,;..+9cITIBxkxhx`{_'`''']]]]]''']]``[`[[[```[R']LhhSE(Wcgh9;1,:,,--3-::::::::<<::::><,;-..199hy6X.1.X..6.96X+o%96XX.1;;;,33::::::::::::::::::--::::::::::::::2222222222222222:::::::::>>>>>>>,;;..+9iy88iit&&%#o########ooo#%66%++++%@ooooooooooooo  o       .XXXXX..66666666++11..1166++  o@++%%%%%%##%############OOO######################O#*tut&####ooooo##%===&&#%%o o%8********8***=%=*&&&&&&&&##$$###$######oooooo%&8t&%%%&&&&*&&&&&&&&&&*****&*******&&****&&***************888**8888888*****&&&&&&&&&&&&&&&&&&&&&&%##%%&&&**&%%%=*88tt888***=***8888*******88uq88qii888*****===**88****===&&%&&&&&&&&****&=*******===******=********888888**8888qquuuuu8wuuuuuw***uuaauuuuuuuuuaaaph",
+"9+X+9hhhhhhiiiuyrreuuuuiiiy96<<<.;199yyyttt888*=&&&*888ttte*&$##&&%%%%%%%%&&%%&*8*&%o   #%%%%%%%%%####%%%#oooooo&*88&%%%%%%%%%%%%%%%%##o#####o##%%%%%%%%%%%%%%%%+++66611.....XX %%%%%%%%%%%%%%%&======*888888888*88888**8**8*****====*==*88**8888qq88qqqqqqq8888***888899996699099711;11;<,<--<<7743,,77f77gghyyipjjhi88888899%%6XX1X9hhhHJxxxy9,--:,,--::::::::::,,<;;19cJYIJITT__{'['`''']]]]]]]]```[[)_`{'__`'[Yzllxxgh7X;;-.,--,,,:-::::::::::::::>>,;;17fggchy+  69+yh89i98**8ty8+X..-:3444::::::::::::::::---:::::::::::::2222222222222222::::::::::>>>>>>...699+o8&&&*&&%#  ##oO#Ooooo+++666+++++ooooo###oooooo  oo  o+oo6111;;;;;;;;;....11111++++%%ooO#++++o%%%o#############OOOOOOO#########ooOOo###%%*8**&%##oo##%%%%%#%=*=*****&%#%&=======****==%%=&&&&&%%%###%##%%##%%%%##oooo#%%&&%%%&&&%&&&&&&&&&&&&****&*******&******&***********************8888***********&&&&&&&&&&&&&&&&&%o#%&**&&%%%%%*888888********88******==***8888qui8888****8**************=&=&&&%&&&&*******88888**=*****==***888**8wwwq888**888888uuuuuuuuuuutuuuaau*8quuuwwuuuuii",
+"f7.199gv998hhhh8wrr*=$&y9966--:3;19yhhii888888qi8888888t*e**$#OO%###%&&%***&%%&*&&%%ooo#oo#%%%%%%%%%###%oooooooo&*888&&&*&&%%%%%%%%&&***&&&%%%%%%%####%%%%%%%%%%++++....6166666+#%%%%%%%%%%%%%%%%==%%%%=%=*88888*88888**88*************=**=**8888qqqqqqqqqqqqqqq*=%%9899911hch8%11771;;;;,,,<-<<44,17999gggghiidappi88qiiqqq88991XX.XX9v9ll999XX------:,::::::::<<,,<;;119cxli8&x!{`)'{`''']]]]]]]````[[_``)`'}Lxcg79f91.7-.--<3:--,,--,--::::::::::::>>,,179999&8*%o%88888iii&8****tyy996-::444::::::::-----------:::,,::::::::2222222222222222:::::::::::>><<<.XX+989&tt*%ooo #o##OOO#OOo++++.....XX o+oo#####oooooooooooo+++o6661;>>2>>>;;;..;1166+++ooo##OOO%%####%%oo##oo####OOOOOOOOOOOO######ooooo#%&&**8**&$###% oo%%%%%=##%&&&*=***%##%========*=%%%%%=%%&&&%%#oO######%%%%%%###oo#%%%%&&&&&&&&&&&&&&%%%&&&&&********&&&*********&*********************888**********&&&%%%%&&&&&&&&**&&##%&&&&%%%%%%=*8888888*************==***=*88*8qu8888*******888ui**8888*****&&&&&&&*********88***==****===*****88***wuuuu**88*8****ttut8***ttttuuuw**8ueewwwuuiih",
+"f7--;;...XX69hhhputiiy+X.;---444-;166%*8***88t888999&&&*&&*&$OOO%%%%%%%%**&%#oo#%%%#oo#%  ooo####%%%%%%%%#oooooo&&*8888*888*&&88&&&*8tiit8888888=====%%%%%%%%%%%+++XXX....1666++ o##%%%&&&%%%#%%====%%==%%===*888888888****===**888888888*==888888q8qqq8qqq88qqqq*=*99996X+czkii9961XX;1;;<<<<<<;1698iiy89yyt*upjjhu=%8iqqqqqqqqv91XXXX996hh+X+X:::---:,::::::::-<<<<>,,-;198ytt9x^][{'[''']]]]]'']]``[[)')EERFf;.XXX-;-;;-77--,3,:----3---:::::::::::>>---;11.X%===8t8=u8ipiu8u*e*=%*yh97,,4444::::::::-----------:::,,::::::::222222222222222244:::::::::;;;;;+X +98yi&&&%%%%+####O###OO+++.......XXX +%######oooooooooooo+++o+661;;>2222,;;..;116+++ooOOO###o########ooooooo##OOOOOOOOOOOOOO###ooOoo#%&*****8OO##%###Ooooo#%%=##$%#%&%&=&&%&&%========%%%%%%=#%&&&&%%oOO##%##%%%%%###oooo%&&&&&&&&&&&&&&&&&%%%%&&&&&&*&&&&&&&&&&&*****&&&&*&&=====******************&&&&&&&&&%%%%%%&&&%%&***&%%%%%&&%&&==&**8888888888888888*88***8888888***8*888*===**88tuaj8888888*****&&&&&&***&==&===**====**==*******888wwwuuuuu**88*******tt**=***tt***ut*8t**eeeuuiihv",
+"3::,,,,1;;;169vv8hhh991.,>543344:>,.XX9iyttty89%899%%%&*&**&#OOO#%%%#####ooooooooo##ooo#oooooooo o#%&&&&&&&%%#oo%&&88888***&*8tu888*88tuut8tuiut8tuiu8=#%%%%%%%%9%%+++66++666%+ ##%###%%%%%%%%%&%%%%%%%=%%%%%=88888888888**==****888888888==88=%=888888*888888qquuii8999.X9hkjpahhh991..;;;:::::168iiiiq88888*upkjpu% 0=qqqiiiiih86696X.X.96X.X.:::::,:-::::::::.<<-->223;.6998ti9L]]]]'''']]]]]''']]``[')RESg61-;,1,,,,-3::-:3--:--37:----:::::::::::>>:;,16679=88*8hkB%kIj8jzkkkjhhhhg7;-:3444::::::::-----------:::,,::::::::2222222222222222:::::::::<;;;;;; o%9*&&&t*&%#o +### O##OOo+++...;;<...++%%%%####ooooooooooooo+oo+++..<,33>,<;...X..++ooO#OOO%%%%OoooooooooooooooOOOOO###OOOOOOO##oOOOo##%&&&&%##&$##%%#ooooooo##$#$==%%&*==&%%&&#%===%%%=%#%%%%8%%&&%#OOoOO#%%%%%%%%##oooooo#%&&&&&&&&&%&%%%%%&&%%&&&&&&**&&&&&&$$$&&&***&&&&&&&&&&&&&&&********&&&&&&&&&&&&&&%%#%%%%%%%%##%&*&&*%##%%&&&*****88**********88tuuut8**8888t88****8**88*===888888up88tt88**=**&&&&&&&**&&&%&===****==**==******88ttuuuuuuuu***88*********&$*ettte**u8tt*====*euy996",
+"4444:::>>;;;;;;19fhhf71>>::44444444:<.++++%%++6696+X %98888&%oo#%%###oooooo##ooo%%o #%#o####oooo%% %%%t&%%%#%%%o##%%&&&&%&&*&&%%&&&**888tttuiit8*uiuuiu=%%%%#%%*%%%%%00%%%%%%%%% #%%%###%%%%%%%&&&%%%%%%%%%%%%=*===*****=*888***88====%%88888*=%=888*==****888888888hv6XX+8pptewiyyhhh96X;;-::::X%8qqqqq99999*8quu**qpjhpiiahiqihyyxLz9X1..;;;>,::::::::::::::::.--<:2222-;699++88hY]``]''']]]]]'''`))[`))}(Wc6.<>>>>>::::::::::::::::::::::::::::::22>>>>;;;;.. =8=ukxk8iuiJ[]{[][Yx961.;;:::44---------:,,---::::::::::::::::::::2222222222222:::3:--<<;....16 oo#&*&#%#oooo++####OOOoo++++1;;....1++++%%##o  ooooooooooo+++++O@@+...;<<<666++6+++ooOO#OOo@%++Ooo#oo  ooo%%%+ooooooooooooooo##oooooooo8&ooo###$$####%%#o  o%%%####&==&#%%%%###=%###%==%%%%%%#o#%%%%###%%%%%%%%%####oooooooo#%&######%%%##@@#%%%%%%%&&&&&&&&%%%&&&&&&&**&&&&&&&&&&&&&&&&&&&&&&*&&&&&&&&&&%##%&&##%%&&&&***&&%##*&&%###%&&****&&=%%%===%****88ttt888888t888888888======*=**=*8t8uiiu888*==&&&***&&&&&&==&=**=%%==*****88****8888u*=****ttttt***tete***&**ettt**********e*#Oo+X.1",
+"44444422>>>>>;;;;17775>>>>,,:::,444:-...++.XXXXX11.XX+99&&%%%%%%####ooooo#o o#%# %&%&%o#####%#   #oo #8&%%#oo#ooo##%%%%%%%%%%%%#####%%%%*88ttt88tt888888=%%%%%%%=%%%%%%%%#%###%%%%ooo#%%%%%%%%%%%%%%%%%%%%###%%====*8888===*88888==%%%%%%%%%%%%%%%======**=*88889999961XX+ypppdutiiiy89y671-,3431.X 0%%0X;;;;110%8utuappaiuiiiihuhihIKh9X;132553::::::::::::::::.--<:4447>-1669i90c)][{`''']]]]]``]]]]'')YEEl-X1>>>>>::::::::::::::::::::::::::::::::2>>>>;;;;;;09999889989izBzJ_Kc7111;;;;:::::--------:,,,:--::::::::::::::::::::2222222222222,--,,;;;....6666o#%%%&&%%#oooooo##oooooo++++.....;16++++%%%%##o ooooooooooooooooOOOo++..1..+++@O+++oOOOO#OOo%%6+OOOOoooooooo#oooooooooooooooooo#oooooooo*%oooo#o#########o oo@#@####%%%%%%%#%%%%####%%%%%%%%%%%%#####ooo###%%##@###oooooOOoo##%%##@@##%%%############%%%&&&%%%%%$$&&&&&&&&&$$$$&&&&&&&&&%&&&&&&**&&&&&&&&%####%&###%%%&&&***&&&&&&&%%%##%%&&&&&&*=&&==&%%%%&====**&&=*88888uu8888*=**=***88***88uuuu888*8**&&&&&&&**&&=&===**===*8888*88*****888u*=======*****tttttt****etttttt***tt****$$&&+XX;",
+"44444444222>>>>>-;>;;;171776<...4444:<<.66+66...XXXXX +%9%++%&%%#########%#oo%%o&%o #&&8&*8ippi888t%  oo%##%%%%&oooo####%#oooooooooooooo#%*88888t*=*888u==%%===%%#%%=%#%##0#####%#   #%%%%%%%%%%%%%%%%%%%%%####%====*88888888888%===%%%%%%%%%%%%%%====****89999911111;;.yy9&tkkkkio oyhlzxg7,::4<<..11.X-:444>>1 %888iiiiiuq888ihj88BKzlf7>:4344::::::::::::::::--<<::443>-..6hxxHI[')]'''']]]]]']`))__}_Y_`S7;7>>>>>:::::::::::::::::::::::::::::::::>>>>>;;;;;11699999hci661X.f7-->7,-;>>:::::--------,,,:--:,:::::::::::::::::::2222222222222,<-<<;..1.X.+++ ##%#####ooooooooooooo++++.......6666+++++%%%%%%#ooooooooooooooooOOOOo+++++ooo@OOoooOOOOOOOOo+%66OO   Ooooooooooooooooooooooooooo##ooOooo&%ooooooOOO##OOOooOooooo##o#######ooo##%####%%%###o  o##o####oo#oooo#@@@%##ooooo Ooo##oo@@@@@#%%%%%%##@@OO######%%%%%%%%$$$$&&&&$$$$$$$$&&&&&&&&%%&&&&&&*&&&&&&&########@####%%%%&&&&&&&#%&&&&%%##%%&&&&&&&&&&%%%%%%%&&&%%%%%&&==*8uuu88t8****==*8u8****8uuttt88t8****&&*****&==*===***=*88888888888888tu8**8uut******ettttt****tttttttt**t88****tty6..1",
+"4444444442222222111;;<67799996664444:<<<169999669999%%*88&#o%%%o%%##########oooo %*8ii8*%%8ihkzNiikkito #  ooo#%oooooooooooo  ooo###oooo o%&&*88t**8ut8***======####%%#0########oo o####%%%%%%%%%%%%%%%%%%%%####%%====**888888=%%%==%%%=%%%%======******%&899961-;;;--;166X+ixkpoo    XXhg9,<>:337f776,344444444X+++9yiyiiii8=%%*8ahhcchg7--4344::::::::::::::::<<<:::44::<<.6ycHBxI{'[]''']]]]]'`))`[_(WFSlf--->>>>>>::::::::::::::::::::::::::<<::::>>>>>>;;;;1.X.1.16ghv1.11.-->22>>>>>>::::::::::::::::---:,:::::::::::::::::::2222222222222<;;;;..X+++ +o  #%&%###oooooooooOoo+++1111......+++++++ooooo+%%%++oo   oooooooooOO  O@++++ooOOOOOOOOOOOOOOo o+++ooo   oooooooooooooooooooooooooo#ooo oo%%oooooooOOO##OOOooOooooooooo#####o  o##%###%%%%###oooooo######%%oo@@#@@@%%#ooooo OooooooOOOO@@#%%%%%%%#@O##########%%%%%$$$$$$$$$$$$$$$$&&&&&&&&%%%%##%&&&&&&%%%###############%#%&&&&%%%&&***&&###%%%%%%%#%%%%%&&&&&&&&%%%%%%%%%=*8tu8*8*=****=88888*****88888888**********&&==**===****88t88888888tttt888*8tt*t*******tttt*********ttttt88888t88y991.;",
+":::::22244422222;<,<;;<11166696644::---;.6999999iyyyt8*&####%%&&%%###o##o o%#o%8ikBBkp88ai8&%%8tt8ppiu%&%#oo#####ooooooooooooooo oo##oooooo#%&**8888uu8%888=%%%%####%%##=%#####o o#%%%%%%%%%%%%%%%%%%%%%%%%%%%==========*====%0 %%==%%%= o#%%%%#*======%%&99961.2>>:---..XX19v9XXXXXX+++XX..<,>3377<..-,:44444::1.X.69y8yiihhi89  %89hh9;;,34444::::::::::::::::<<::::::::,<..<6y9c}')''''']]]]``[)`[}YLzl9--,33>>>>>>>:::::::::::::::::::::::::<<<<::>>>>>>>;;;-;;;;.XXXXX.1..173>--:23>::::::::::::::::----::::::::::::::::::::::2222222222222....XXXX++++oo%%==**=%##ooooooooOo+++1;;;;;..++++++++oOoooooooo++oo    ooooooooooooooo%&++oooo@@OOOOOOO#oooo    oooo    oooooooooooooooooooooooooooo  o%ooooooooO####OOOooooo#@@%%%%####oooo%%%o#o o####%%%%%##o##%%%#%%####%@%%%%%#ooooooooooooOOOOOO@@$$$&$$#@#####%%%####%%%%$$$$$$$$$$$$$$$$&&%%%%&&&%%#OO@#&&&%%%%%##%%####%%%%%%%%%&&&&&&&&&=&&&&&$$$$$$$$%%%%####%%%%%&&&&&&&&%%%&%%=888***=**88*8**888*====*******&*****&&&&&&***88*=*88888888******8***8t8**8*%&%$&=*eetttt************ettt88yyyyyyg96;",
+":::::::224444444--:,<<<<-..-<<;.;;;;;;166999&&*tt888*&OOO#$$#%%&%%#ooooo#o#%&*ijNBxhi8*8%&*&%#%%&    #%%%%#oo%%###oooo##oo####oooo#%%##o%#oo#%%%=***8uu*iiu8=%#%o@###%%#=%%%%%@o#%%##%&8%%#%%%%%%%%%0o####%%==**========%%%%%%0 #%%%##%=  ##%%%#==%%%=&&%%6661<-32::,,--7,---X-;;19hlly1.1..;;----....XX---:<<11--<11669699yhhhhhh+X+vvf.;;,:::4::::::::::::::::::::::::::,<--..+cL}]]{]'']]]```````_Yzc99<-73-4>>>>>><<::::::<<,,,,,,,,::::::::<<<<<:>>>>>>>>>>-,,<<76<1<<,,,:----,33,::::::>>>::::::::---:,,:-:::::::::::::::::::2222222222222X....+++988*&$&*==**=%##ooooooooOoo..;;>>>;;1++%%#oooOOOooo            ooooooooo ++  o+%o++ooo++Ooooooo%ooooooOO    o   ooooooooooooooooooooooooo##o   ooooooooo@@@@OOOOOOOo@@@@%%%#o       00        oo###%%##oo######%%%##%@%%%%%#oooooooOOoooOOOOOOOO@##$$##@%%%%%%%%##%%%%%%$$$$$$$$$$$$$$$$&&%%%%&&&&%@OOO@%%%%%%%%%%%%%#@@%%%%&&&&%&&&&%%&&&%$$$&&&&&&$$$$&&&&$@@@@@@#$$$$&&&*&&%#&##%*88*uut888*=8*=*88*===%===**==&&&&&&&&&&&***8tt*=*88ut88***=***88***889*888&%%$=**ewttutt88t**********tiy89999yhhg9;",
+"<<<,,>>:24444444::33333333332222;;;.;166998*==*e*&&**&$OO$$$$###%%#ooo##&**%*tii&&o #%%&tiii8&o  o#&8ii&&88%o##o##ooo#%%%%##ooooo#%%%%##%##o##%%===*ttttiiut*=%#o@@oo%%%%%%%%%@@%%#oo#%*oo o###o000000o###%%%===========%%%%%%%%%%%###%=###%==%#%%%===&%++..;<::444:43,:--3324375fclh91X61XX796..698iq9%+1166%%%433>--;1X.1699hhhzx9XXX67<--:,,:::::::::::::::::::::::::--<<<,,,+chhE{'_'']]]```[[`']}WL6..---:3>>>>>><<<<<<<<<<,,,,,,,,::::::::<<<<<:>>>>>>>>>>33:-----<<<XX,3--<,<---:::2:2>>>:::::::::-:,,,,-:::::::::::::::::::2222222222222..1698y8yytt*&$$*=%%%%#%#oo ooooOo ..;>22>;;.++@#OOOOOOOOOo           oooooooooo..XX  ooooo+++++ooooooo+oo###OOO   oo   ooooOOOOoooooooooooooooooo%o    ooooooooOOOOOOOOOOOooOoo#%%#                       ooooooo###ooo#oooo@@@%###oooo#oooooooOOOOOOOOOOOOO@@@###%%%%%%%%%%%%%$$$$$$$$$$$$$$$$&&%%%%&&&&%#@@#%%%%%%%&&%%%##@@@%%%%&&&&%%%%##%&%%%$$$$&&$$$$$$$&&&&$@@@$$$$$$$$%%&&&&%#%%%%=*88iaaitt88ut8tt8***=#%===*==&&&&&&&&&&&***8t8**8u8t8*****=*88888**   %&&&&*****ee*tttt88tt**********889961.++696<X",
+";;;<<,>:22444444444:444444444444XXXXX1669%%%==$$#O#&&$##O#$$$###&%%###%%*ut#%8&  #o o%&8kji8%#o  *oo8kJNkNNh8*&%#ooo##%%&%%oooooo#%%%%#oo###o#%&t*8uu*%=88888=#  @@ooo%##%%%%@%%%#  o###     oo 00000%%%%%%%%##%%=======%%%%%%%=%%%##%%=%####%%#%%%===%o  X.-<--3334::::434444442222>;;;.X.9ll9XX68iiiiii888iiaaff4:>,<;...XXX1699hc6.1...;<,--<::::::::::::::::44:::::<-<<--<--  X6hF}]'']]```[']``[)RE6X<7-:7-;;;>>>;;<<<<<<<<,,,,,,,,::::::::;<<<<:>>>>>>>>>>--:,,<-<-X-73:::-...<,,<::2:2444::::::::::,373,::::::::::::::::::::22222222222226669yhhh888***=$8=%%%%%%%#o  oooO X..>2442>;.+oo#OOOOOOOOOooo+++      oo  oooooo11XX++o   o++++++++++oo+oo%$$#OO+oooo    ooOOOOOoooooooooooooooo o#oo   ooooooo#OOOOOOO@@@OoOOOO#%%%%%%%%                    ###o#%%%oooooooooo@#ooooooo#oooooooOOOOOOOOOOOOOO@@@@@#####&%%%%%%%$$$$$$$$$$$$$$$$&&%%%%&&&&%%#%&&%%%%&&&&%%##@@@@##%%&&&&%&%%%%&*##%$&&&&$$$$$$$$$&&&@@@$&&&&$$@@o#%&&&%#%&===*8utipaiaphpiiiu888*=#%===*==&&&*******&***8t8**uu88*==**8****88***+  %9988*****e****88***8==******e*&%+.XX..XXX..<",
+"::::::::22222222222::22222222222442,166+8*%%&&&#8=%%%%$=$###$##oooo#%####ukuuiJx$&  %  8&*hiclcy#%%%#%ukINkzki8*=%#%===*$#=*##% oo#&&&&&%o #%#  8888t8&%###%*8%ooooooooooo%%%%%%Oooo+++++X  +&&&oo#ooooo +%%%%%%%==%%%%=%%%%%=====%%##%%%%##%%==##=%%673444444>>::<<<<<<<<<:::44::::::::,-:7ff7-;1698tuuqqqqiiiiuq8%0XX;;;;,,--<...--,fg,>----<<444::::<<<::::::::::::::::::::::<.;79glH'[)]'`))^)))ER}x;;;<<<<<::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3::-<<<<;;<>>2222>;;..66998cxchhi*%%&*%%&&%%%##O##Ooo ++1<;-:4444>;.X oo+oo+++XXX   OOOOXX++++11;1111+oo++      ooooooooOOOOOOOOOOOOOOOOo@@@@oOO@oOOOOo@ooOOooOOOOooOOOOooooo oo@oooooo@@@#%#@ooo#%%%##o  o%%%%%%+o          ooo#oooo#%%oo######ooooooo#ooooooooOOoooOOOOOooOOOOOOOoo@@@OOOOOO@#OO@######$&&&$$$&&$$$$$$&&%%&&&&%%&&&&&&%#@@#%%&&&&%%@@@#%%%%%%#%&&&&&&&$$$$&&&&&$##$$$$&&&&%%%&&&%%##%%@@%&&&&%&&&88888888tttuituiiut****&&*&$#$$$&***&88888**8ty899971444:<1++98y99977X0%988*&******=$==*=*ee***899966::::::::::::::::",
+"::::::::22222222::::::::22222222::,36666%%&&&***8=%%%#$=*$$$&&#O  #%&&%#**eapkBx$ #&o%t yxBzLYTJxi8u8===  %iBIIBxh8%o%*8%%###%##oo#&&%%%&%%&*&%#%%&&*&&%#oo#%&% ooooooooooo#%%%#Ooooo+ +X +%&&%O#%%%+ooo+%%%%%%%%%%###%%###%===%%%%%%#%%%%##%===##%%+1,:444442:,::<<<<<<<<<:::44::::::::---<,,<-;169888qq888qqq8iii891X.1;;----<-.--<,7f-:>:<-<<444::::<<<::::::::::::::::::::::<-;167gc[{{'Yxcx^[[REES9;;;<<<<<::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::--<<<-;;<>>2222>;;..160%88*&8u8&#%%%%%%%%####OOOOoo+++1;;;:2442:-.X++o%++++++X+X      XXX++....;;11+oo+++     ooooooooOOOOOOOOOOOOOOOOOOo@@@oOooOOOOoo@oooooOOOOOOOOOOoooo   o@oooooo@oo@#%%##o#%%%###       o+oo  oo+#ooooo###############ooooooooo##ooooooooOoooooOOOOOooOOOOOOOooooOOOOOOO@$$$$$$$$#$&&$$$$$$$$$$$&&%%%%&&%%%%%&%%%%#@@@%%%%%%%#@@@##%%%%##%%&%%%%&&$$$$&&&&$#@$$$$%%%%%%%&%%###%%&@@@%%&&&&&**8888==*88888888t8**=**&****&$&&&&***88888***tyy9961.444:<<6699996111 +%8tt**&&&***&&=**==**tt8966...::::::::::::::::",
+"::::::::22222222::2222::22222222::,161. o+%&&&&**=%=====*=$$&&#Oo#%%&%%#O=*kkLx9#*%@&%%icxhy8999hzxhhh8yh8&ihhcJYIJBj8&%%=##**%&##%%#  ooo#%%o   o##oo#%##oo%%%  oooooo oooo#%%oOOooo+++ +&9&%OO%%%%%+++%%%%%%#%%#ooo##o####%%%%%===%%==%%#%%====%%+1;-:4444::<<::::<<<<<<<:::44::::::::-::----<;199888*q8888888quii8999977;-,,-<--<<;;,-->,,:::44:::::<<<::::::::::::::::::::::<;;;.;69clxli69iL_[KWWgX;;;:<<<<::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,<<-;;<>>222>>;;...6&88%&uut###Oooo%ooooooOO Oooooo ....<::::;...++%%%+o +++++++++  ++++++....... oo++oooooo+oooooo+OOOOOOOOOooooooOOOOo@@oooOOOOOOo@oooooOOOOOOOOOOoooo   oooooooo@Ooo#%%%%oooooo##        ooooo%%%%##ooo####%%%##o##oooooo##oooo##ooooooooooooooooOOOOooooOOOOOOOOOOOOOOOO$$$$$$$$#$$$$#$$##$$$&&&&%@@%%%%@%%%%@@@#@@@@@@@O@@@@##%@######@@#%%##%%$$$#####$$@@#$$###%%%%%&####%%&&$@@@%%&&&&******$=***=&&%%%%%$##********&***&&**u88ttt8tty8961..::3:--17996+XX   %8yt88*&*888**88888**8t9%+.X.-;::::::::::::::::",
+"::::::::222222222233332222222222<,,666++++%&&&&&*=%====*==&&&$$$&&&&%%%%%*8klNh1y&+  +99NxXXXXX.+hBzhlKWRYHLR}YEWE}^Ixi8*%o#**%#  ooooo%o#%%%o          ooo o%#o oooooooooooooooOOoo%%%++%%%ooO##%%%#++%%%%%o   %#o ### o######%%===%%=*==%%=====%00.;::4444:<<<4:::::<<<<:::::4::::::::,,,<--<,;16988***8888qquqquiqiih996;<77,::::;--;,;-:23444::::::<<<::::::::::::::::::::::<,<-.;11.XXXX.69hHRYWz7;;;<:::::::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,,,,<<;;<>>>22>>;;;..1=&%&uja&#OOOO o@o   oooooooooo    ...;--<;...+++%%+ooo+%+6666111+++   X....XX oO++ooooooooooo+++OOOOOOOOOooooooOOOOoooooOOOOOOOOooOooooooOOOo@oooooooooooooooooooo@#%%%%ooooo##%#ooo    ooooo#%%#ooooooo###%%###oooooo#####oooooooooooooooo@ooooOOOOoo@@@@oooOOOOOOOOOOO#####@OO#$$#@@#$O#$$$$$$%@@@@@@%@@@@@@OOoooooooooooo#%%%###############%#@@@@@@@$#@@#$#@#%%%%%%%###%%%&&$$@@$%%%&&=**===&&***&&&&&&&&&&&&&&&**&&********ut88tt***&%+X.;1-<<:-:,771.X ooO&8yyy8&%&9999669%99999%6XX..;>>2::::::::::::::::",
+"::::::::222222222233332222222222<<7799yy%%+%&&&&=&&****e*ete&$$*%=*89%&&8%yzxh77 99+hlhhKK9.166XX16696gHzzxHREKEW}RLKRJyt&ui%%u8%oo%%o  o%&&%o      oo       oo  ooooooo###oooooOOOo%%%%%%oo OO$Oo##o++%%%%%##oo%#  o##o#%%#  #%%%%###%=*========%0X;;:4444::<<<444::::::::::::::::::::::-----<<;..%88*===*88888iiiuq88y891X1ff3::2>-;1771-->344:::::::<<:::::::::::::::::::::::<,,-;<<;;111..169gxRWf.,;<>:::::::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::<<<<<::::::::,,,,,,<<;;<>>>22>>;;;..1#&tuut*$#OOoooo+oo  oooooooooooo++++..;-<-...X++++++oo++ ++1.;;1      ++....+ooOooooooo+oooooo++OOOOOOOOOOooooOOOOOooOOOOOOOOOOOOOOo@@@@oooo@@@o@ooooooooooooooo@@@@#%%%%%##%%%%%%#o   ooooooooooo  ooo##ooo##%%#oooo#####oooooooooooooooo###oooOOOOOo@@%%@@@oooOOOOOOOOOO@OOOOO###@OO#%@##%%%%#@@@@O@@###@@@OOOoooooooooooo#%%%########O######%##@@###%%###%%#@%&&&&%%%%%%%%%%%&&$&$$$#&&&=====$&&&$$&&&&&&&&&&%%%%&&%%8*&&*88*8*&&&&%@o XXXX;1..-,322>>;XX+&&&tt8889%++6661;;1.11696.XX.;;>254::::::::::::::::",
+"::::::::22222222::2222::22222222<<1679996++++%%%%%&*te*e*tt*$O%&%=888&%%+oicc7-299.yRE999g..1;;.9X.6XX661X.fg9hWExhxERJlx%%iikk*%   %%   o%%#o      ##o         ooooooooo##oo ooOOOo@%++%oo OOOOOOo#o++%oo0o#%###o   ooo%%=%  %*%%#o #%=========9%1.;,244444::<<4444::::::::::::::::::::---<,,<-;XX+***====8***8qqqqq8**89XX.775::>;;19yy9;->344::::::::::::::::::::::::::::::::-<,<-<;---;;;;;1669lh;1->>>:::::::::::::::::::::::::::::::::::::::::::::,,,:::::,,,,,,,,::::::::::::::::::::::::::::::::::<<<<<<>>>,,,<<;;;<,<:-<<:>>>222:;;;..1O&upu&&*$oOo++++oO   oooo   ooo#%%%++.<<<-....XX          X..;;>   o++%6+++++oOOooooooo+++o+++++OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@OOOOOOOO@@oooooooooooooo@@OOOo####oo####oooo   ooooooooooo ooo##ooooo#%%#########oooooooooooooooo#####ooOOOOOOoo%@@@@@@oOOOOOOOOOOOOOOOO@@@OOO@#@@@###@@@@@OOO@#@@@@@OOOooooooooo##%%%%&###############%%%%%%&&&%##%%%#@%&&*&&%%&&&%%%##&&$&&$##&&&&==&$$$$$#%%&&%%@@@%%&&&&&&&%&%%%&9&&&&&%%%++ XX.;--;..-<3225;;.+&&&&&++++++X.111;;>>>;;111.X1,,>:444::::::::::::::::",
+"::::::::22222222::::::::22222222---<;<11..XX.+++oo%*t88*&**&@o%&=*88&%%%%%9X.1>36.lzg6X.;..17X-,X1;.11.;;1;.;1116976cYWchikxiikjh9  %&&% %&&&&%o    oo  ooo     ooooooooooooooooOOOOo#oooooOOOOOOO##ooo+   o#%#o      o#%%%%%%%&=%###%%%%%%=====9%+X.;,:44444:::444442:::::::::::::::::::::,,,<-..+%*==*=*88***8888*w***u8+XX;;-2>;;.69hh961;>24::::::::::::::::::::::::::::::::<<,,<--:,;-->33>...XX;7->>::::::::::::::::::::::::::::::::::::::::::::::,,,:::::,,,,,,,,::::::::::::::::::::::::::::::::::<<<---;;;;;;;<;;-;;,<-<:::>>>>2>-;;;;1 O&tt&#o@oo+++++OO    +++ oooo###%%++.;<<---...XXXX     o++61117oo+@%%%%+++++oOOOOOooo@+++++++++@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@OOOO%%OOOO@oOOoooOOOOOooooOOOOOOo#oooooooooooooooooooooooooooooooooooooooo#####oooooooooooooooooooo####oooOOOOOOOOooooooooOOOOOOOOOOOOOOOOOO@OOOO@OOOOO@##@@@OOO@#OO@OOOOOooo#%%%%%%%%%%%%##########%%##%%&&&&%&&&%%%%&%%#%&&*&&&%%%%%%##O$$$$$$$$$$&&&&$$&&&%@@++%%%%%%%&66666666++++++66%&&%%%6++..<,:::;;<<<>>,1669**&$+XXXX..X;;<>>2243>5>,>>>,>::4444::::::::::::::::",
+"::::::::22222222222::22222222222-<<<<<;;;;;....1  +999999&%++%99===%#%&89++X.7->.6g<X6<---7X-:3-7--,---3;->3--;,<-;67ylLHLIINcccTNy+++o  +&&**&oooo     o##        oooooo   ooooOOOO#%@o@@oOOOO$####oooo%+#%%%#  ooo o#%ooo%%%%%%%##%%%#%#%%====%% X.;;-:444444444444222::::::::::::::::--:<<---.169*==*==*8*=*8qq*=***w*&%+X.;73;..+%8iii96;;;>::::::::::::::::::::::::::::::::,:,3,-:3-:,2222>;X1;;,-3>>::::::::::::::::::::::::::::::::::::::::::::::,,,:::::,,,,,,,,::::::::::::::::::::::::::::::::::<<--;;;;;;;;;;<;;;,,,>:::::>>>3>-;;;11 o&8*%o ++++++66O     ++++++%#OOo++++..<-----;..1...+%%%@%%66677oo@@@Ooo+++++oOOOOOOO@@%@+++++++%%@OOOOOOOOOOOOOOOOOOOOOOOOOOOOO@OOOOOOOO@&&@OOO@oOOoooOOOOOooooOOOOOO@######oooooooooooooooooooooo  oooooooooooooo####ooooooooo########oo###ooooOOOOOOOOOOOOoooOOOOOOO@OOOOOOOOOOOOOOOOOOOOO@#%@@@@OO@%OOOOOOOOoo#%&&&&&&&&&&&%%%####%%%%%%%%%&&&&%%###%%%%&&%##%&**&&&######OO$@OO#$$$$$&&&&$$@@%++++.XX.....+...1...1XX....16+696666671--:::3;<,;..1669988*&&.....;.-----::4425:22:-,::::4444::::::::::::::::",
+"::::::::::::::::::::::::22222222:::::::>>,,>>;;;X.69996696+99999===%%%8iiyhyX.<,---<<<<,---:::::>>>>>>>>>>>>>>>>,<--;166WHNchll%lI_l9+    *%%o#o%%%%%%o **&%o    ooooooooo o#%#oOOOOO%%ooO OOOOO*&#oo#%%888&%%&%%&%%#%%o%%%%%%%%%%%%###%### #%%###ooX.;;::44444422::::22:::::::::::::::::::<<<<-1998&&=====888**=****==*==&9961;X..+%*8tuuiy9..;<<<<<:::::::::::,,,,,,,,::::::::::::::::::444444;;;;;;>>>>::::::::::::::::::::::,,,:::::-::::::::::::::::::::::::::::::::::::::::::::::::::::,,,::::::::::<--...11.XX.16..;;<>33<<::::>>>>>>;;;;%%9&%+++++.....1ooo  XXX++++oOOO+++XX.;::::,,<<<51166%+@&%+%+X.1+oOOOOO@++++oOOOOOOOOO@%@@++++++@OOOOOOOOOOOOOOOOO@###@O@@@####@@OOOOOOOOO@&&#OOOo@@OOo@oooooOOOOOOOOO@@OOOOo###ooooooooooooooooooooooooooooooooooooooo##oooooooo####oooooooo##o  OOooO OOOo@@oOOOOOOOOOOOOOOOOOOOOOOOO@OOO@%%@@%%oooooOooooO   ooo#%&**&&%%%%%%&%#oo#%&%%##%&&&##%%%###########OO##%##OO###%%%%&#O$$$$$$&**&&&899+.............;;;;;;;;..;;;;11.......-;--:43443:-...+9&&tiy&+%<,77,--:::::::::42222:::::::::44::::::::::::::::",
+"::::::::::::::::::::::::22222222:::4444444222222.;166611116666++=**&oo9yxyy+X1<-<<<<<<:,--::::::::::::::::::::::<<---<11XhLx6X99+HElch%%+%& ooo&&&&%%%# &*8tt8#  ooooo#oooooooooOOO#%&%oooOOO###&&%%%%%%%&&%%%&%%%%%%%%%   0+%%%%%%%%######o#%%#$##o++66;>>44444--:,3333:::::::::::::::::::<<<<<1799&*=====**88*********==*99961666%&*euutt89+X.---<<<::::::::::,,,,,,,,:::::::::::::::::4444444;;;;;:>>>:::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,:::::::::--<<<..X6996666111,,>>><::::::>>>>>>;;;+6666+++....;;;1++++++%6+++++ooOXXXX.;-:::::><<,77116+%%&@@%%o +ooOOOO@@++oooOOOOOOOOO@%@@ooooo+OOOOOO@@@@@OOOOOOOOOO@%%&&&%######@OOOO@@O@%%#O@OOOOOOOOOOOOOOOOOOOOOOOOOOOO####ooooooooooooooooooooooooooooooooooooooo#ooooooooooooooooooooo#ooOOOOoooOOOOOooooOOOO@@OOOOOOOOOOOO@@OOOOOOO@##@@%%oooooo OooOooooo#%%&&&%%%%&%%%&&&&%%%%%###%%%%%%###################OOO####%%%%$#@$$$$$$$&*88*&661...-<<<<<<<<<>>>>>>>>>>>>>>,,;;;;;;-:>:44444:25;1++@$$ett&++X::22:::::::::<<<:::2:::::-::::::::::::::::::::::",
+"::::::::::::::::::::::::222222224444444444444444<<,,<;;;..11.X.1*$O#8hlzh+ XX1<-<<::::::-::::::::::::::::::::::::<-----;111.196XX669xllx%9% %% 8####%&&%o#*uii&  oo  oooooooooo OO##%&%OOOOOOOOO###%%%%%#%%%&*&%%&&&%%%o   o++%%###%%##o##oo#########++6.;;>2344<,,,,,>>>>>>>>><::::::::-::<<<,,116+&*=#====***8********===889999988**ewuutty9%+.----<:,::::::::,,,,,,,,:::::::::::::::::::44444;;;;:>:::::::::<:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,<::::::::-<<66..+99996+.X..;>>44::::::::>>>>>>>>.11111111...;;--++++%99&+++++oooXXX;;,>:4::-;;;;35;..+++%OO$%OOO+oOOO###@+oooOOOOOOOOOO@%%%@oooo@@@#######@OOOOO@OOOOO@#%#@@@%&&&&&&&&&&%#%&%##&@OOOOOOO@OOOOOO@OO@OOOOOOOO#####OOOOOOOOOOOOOOOOoooooooooooooo##ooooooo#oooooooooooooooooooooooooOOOo@%%oooOOOOoOOO@@@@@OOOOOOOOOO@#@OOOOOOO@@@@###ooooo  OOoo#%###%%%%%%&&*****&****&&%%%#%%%%%&%%%%%&&##%%%%%%%%####OO########%#$$$$$$$&&8t89+<<<----:::::::::>>>>>>>>>>>>>>>>;;;>>>22422:::::>,16&$$$ret&@+.X4:::444::::<<---:::::::----<<:::::::::::::::::::",
+"::::::::::::::::::::::::22222222444444444444444422:::>:<;;;.XX.6*&%&99+X+XX6661-,,::::::::::::22:::::::::::::::::,,:::;--<.X66.1+XX+yNTx9+% *oo%#ooo%&*&  o&8t8%          o   ooOOOOO#OOOOOOOOOOOOOo##oo%%%%*8&#%%&%%%o o+++00+%%###%%#o##oo####$$####+++..;,3>>;;<<<<>>>>>>>>><:::::::::::<<<<<>;.X+%&%====**88*******====&&999&*****wuuuuui89%<<.-<<,,::::::::::::::::::::::::::::::::::::::::<<::::::2::::<<<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::--::::::<<::::::::<6666.9989%++X+.;;>244:::::::::>>>>>>>;;;;.......<61;.X.++++++ooooooo ..;,773:3:--;;11;.XX.+++%OO$$OOO%@@O#$##@++ooOOOOO@OOO@@&&&%#@@%&&&&&%%##OOOOOOOOO@##@OO@@@@#%&&&&&&&&&&&&&&&#%&&%%##@OOOOO@@@@@O@@$$#@OOO@###OO#OOOOOO###OOOOOOooooooooooooooooooooooooooooooooOOOoo@ooOOOooooOOOOOo@%%%@oOOOOOOOo@@@@@ooOOOOoooo@@ooooooooo@@@oo#oooo#ooooo#%%####%%%%%%&&****&&*****&&&&&&&&&&&&&&&&&#%%&&&&%%%%%%%&&##%%####@#%$$$$$&&&9996.<<<:::24::::::::::::::::444:::::;:>>2244422:-;<66699&$$$ue&&%++63444444::::<<-;;::::::::---:::::::::::::::::::::",
+"::::::::::::::::::::::::22222222::444444444444444444422>71;.X.+6 +996.X.+69gg71<::::::--::::::::::::::::::::::::::,33,>>-,-;76.1XX+XXyIHc&cip@t8t8&&&&&%#o o#&88o       oooooooo oooooO oo#oooo#OOOOo#%%%%%%**&# o###%%o%%%+0 ++%###%%%##o######$$$$%%%%%+XX.11;....;<,3>>>>>>>>:::::::::::<---->>;XX+&***===**********=*==&%%%&&&==**wu**88t8*%61<--<::::::::::::::::::::::::::::::::::::::::::<<<:::::::::<<<<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::---:::::<<:::::::,,,166688&%%&&%9961>244::::::::::>>>>>>;;;;.....X.6761..166+ooOOOOoo  +;;>3773-,<-..1++1.XX+++%%@O##OO$&%###$#O@++ooOOOOO@@@@@#%&&&%%%&&&&&&$$##OOOOOOOO@$$$$##****&&$#OOO@###@&$&&$@O#&&&&%@OOOO@#%#@@O@$$$$@OOO#$##OO########$###OOOOoooooooooooooooooooooooooooooo#%OOOO@@@ooooo@@@oOOOoooo@%@OO@@oOOOo@@@@@oOOOOOOooooOOOo@oooooo@@ooooooo#%%%##%%%%%%%%%&&###%%&**&&*****&*&&&**&&%&&&&&&%#%%&&&&&&&%%%&&&%%%%%###@@#%#$$&&*9966..<::,,24:::::::::::::::::222:::::::>22444>>>;..66699&$$$rur$&&%69::33::::::::<---:::::::::::>>>,,::::::::::::::::",
+"2222222222222222::::::::22222222::::444444444:::4444442:;;.X+699hg96.;67666991;-<<<>::::>>>>>>>,::::::::::::::::--::2242-33-.X<f9+XX+Xx[xhHxh&hiit*&&&%%&%#  o%8oo     oooo     oo@ooooOooooooooOOOOoo#%%%%#%%##ooooo##oo++   ++#####%%##o########%%%%%%&%++++++66.<;;;<>>>>>>>>:::::::::::<<---42,XX+&8*====&=************&####&&===*8q8qq888*%66<;<<,::2:::::::::::::::::::::::::::::::::<<<<<<:::::::,,,<<<<<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::----::::<<:::::::,,<..668**&&&&&8961>244:::::::::::>>>>>>>;;;...666996.X;166+oOOOOOo++++>>,333,-<;..++++&+o  ++%%%@@#$$$&%%@##OOOooooOOOOo@%%###O@##@O#$$$$$$$$$$@OO##OO##@@$&&*tttt*&$#OOOOO@##&$#$$#OO&&&&%OOOOOO#%#@@#$$$$@OO@#$$##OO###$$###$$$#############OOOOOOOOOO@OOOOO@@OOO@%%@OO@@%@@OOOOOOOO@@@oOOOO%oOO@%%@ooo@@@@@OOOOOOOOooOOOO@%ooooooo@oooooo#%&&%%&&&&*&&&&&**%%%%&&******&&&&&&&&&&&&#%&&&%%##%%&&&%%&&&%%###%%%%%%##@%%%%&&&&&6+...;-::::::::::::::<<<<<<<<<:::<<---:>>22222>;;..+%9$&*$$$*e$&&%&8% .-<<<:>2>>>><;;;:::::::>>>>>>>>>::::::::::::::::",
+"2222222222222222::::::::22222222<<:::444444::::<4444::::.;66999&66<-->-X;1XX.X;--;;;;:>>>>>>>>,,<<<<<<<<<<<<<<<<;::>>:44::-:3,<196+XXX9hhhzciyitt&%%%%%#&%%o  o#o     o%%oo oo  o%%oooooOO  ooooOOOO  o#%%o  o##%%o       +   ++oooooo#%###%#o#####%%###%#####%%66666<;->>>>>>>>:::::::::::<,,,,43,.X+%*==%%%%%$********8**&####%%%#%=8qqqq888*%66..-<,::22:::::::::::::::::::::>>><<::<<<<<<<<<<:::::::,,,<<<<;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::-----:::<<::::::::<;..+6=*e*&&&&++.;>234:::::::::::>>>22>>;;;;1699999+XX;;..+@OOOOOO+++6>>>>::--;.X++%%%&$@O@++++%%#$$$$%+@OO#O@OooooOOOoo%%%#@@OO@OOO#$$$$$$$$$$##$$$@OOOOOO#$&$&&&&&&&$$$$$&&&&$O$&&$$&&%&&%@OOOOO@##%$$&$$#OO##$$$$$#$$$&&$$$&$$$$$$$&&&&&%%%%%%%#@@@@@@@OOO@@@OO@#%&@@@@&&&%@OOOOOO@%%@oO OO&%oOO@%&%%@@@@@@OOOOOOOOooooOOo@oooooooo#oooo#%%&&&&&&&&*****&&&&&&&&********&&%%%%&&&&%&&%%%%##%%%%%%%%%&&&%%##%%&&&%%%%%%%&&&&%++..;;;;;<>>>>>>>><;;;;<<<<<<<<<<<<<<<-:>>>22>>;;.++&&&$$$$$&**@&&%&*%O....;;>>>>>>>>><:::22:2>44>22222::::::::::::::::",
+"2222222222222222::::::::22222222<<<::::444:::<<<3444:::<799y99@ .<,;->33;7.;;-32---;;<<,>>>>>,,,<<<<<<<<<<<<<<<<,,>>>:443::----<9XX.+XX 9hchhxht8%o#%%#o&%#o   oo    oo%&%oo%%%#@%%ooooooO oooooOOOOO oooo   o%%#oo   o  o+   ++ oo   #%###%#o#%%%%%%######$####+669771,>>>>>>>>::::::::--:,,,3742>.X+%%%%%%%%##=====&&&&&&$#O######%=8qqq8888=#61..-,,,:22:::::::::::::::::::::>>><<<<<<<<<<<<<<<::::::,,<<<<;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::-----:::<<:::::::--...++#=e*&&*t++.;>344:::::::::::>>222>>;;;16699999+++1;..+@OOOOOOo+66:>>:----..X++&&$$$&**&%++%%%&$$$++oOO$##Oo+ooOOOo@%%%@@O@#$$$$$$*&&&$$$$$##$&$@OOOOOOOOO@#$&&**e&&$$&&&*e&O$&**&&%@%&&&@OOOOO@%&$$&&&&$$#$$$$&&&&&&&&&&&&&&&&&&&&&&&&&%%&&&&&%%#@%%#@@@@@@@@%%%%%@@%&&&&%@@O@@@%%%@OOOo@*&%O O%*&&%@@@@@OOOOOOOOo@@@oooooooooooO%#oo#%&&*&&&&&%%&&***&#o%%&&&&&%******&&%%%&&&&&*&&%%%%%%%%###%%%%&&&&&%%&&&&&&&&&%&*8*&+ XX;13>;<<>>,,3>><;;;;;----------------<>>>>>>>;.1+&&&$$$$$&*&@&+%*&$$&6..X;<;->>22>>>>:::2422444222222::::::::::::::::",
+"2222222222222222>>>22222:::>>>>>3553:>333>>:--,,XX...666hhhf7;;;3,,::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::::-<;...X+99hzNz  y#oi9o++++    +    ooo%&&&$&&&*tt&OOOOOOOOoooOOO##OOOoo    +++  o     ooooooo%@OO%%OOOoooo###%o+%%ooooo#%%####%%%%%%%#  XXX.;<;1,<-<33444277662;;XX+%$$$$%%%%%##%====&&&&&%###%%####&*=***8*%##O  XX;,::444::-4442::::,,,,,,,,::::::::::::::::::::::::::::::::::::::::,,:::::::::::::::::::::::::::::::::::::::::::,,,,,,:::::::::::::::::::::4444444:3,-...+.%+%&**&&@ XX-344:::::::<<<<<<<<<<-:44>168r$$#%+.  o+%966961;,3>>:::443:-,...99&@&&&&*&&$$$$$$$##OOOOOOOO@OOOOOOO$$#$&$$O#$$$$#OO#$&$OO#&#&&***&#$$&&**&&&$$&ete****&&&$$&&&****&&&@O@&&$#@OOOO$$&&&&&$$$###$&&&$&&&&&&&&&$$&&&&$&&&&&&****&&&&&&&&$$$$$$$OOO$&$O&$#OOO#$&*88*&&&*&%@OOo%&&%@@%&&%%%@@@@@OOOOOOOO@@OOOO@@OOOOO OOO#Oo%&99+%&&%O#&88******%%%&&&&&%&**&&&&%%%%%%%%$$$$$%%%@@@@@+++OO##%%%%%&&&&%&&$&8yy971;-:---::-.....<<::444:<<::::::::::::::::::<<<<;<;;169&$$999&&$$$e&@+6117;;;<<,,,---<,,,;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+"2222222222222222>>>22222::>>>>222522:33-:-,7,,3;X.69999966611;,,,,:::::::::::::::::,,333:::::::::::::::::::::::::::::::::::::::::::;;...X+++8hcc% o %8+oo            ooo@%%@#$&&&&*&#OOOOOOOOOOOOOOOOOoo               oo oooo+%OOO@@oOO ooooooooo+ooooooo##OOOO###%%##o%+++....;;;..---4442,1.X>;;1+%%$###%%%%%&======&%&&==&%%#####%&*%&&=***&#@+++..;<:::::::4422::::,,,,,,,,::::::::::::::::::::::::::::::::::::::::,,:::::::::::::::::::::::::::::::::::::::::::,,,,,::::::::::::::::::::::::44::::--....+.+++&**&&t961<-44::::::::::::::::<<:44:,6**&$$%+X89&+699961;;>>>5,,:::::-<.X.+9&@&&&***&&$$$$$$&&OOO@####@OOOO##@$$$$$$$$#$$$$$#O####OO$&$$$$&&*ee*&&&*et&&&&&**e&&&&&&&&&&&***&&&&@@%&&&$OOOO$&$&&&&&&$$$$$&&&&&*&&&&&&&&&&&&&&&**&&&&*******&&&&&&&&&&&OO##$$&&$&&&$OOOO#%&&&&&8&&%@O OOo@%&***@@oooOoo@@@@OOOO@@OOOOOOOOOOOOOO##Oo%&%++%&&%#$&********%%%%&&&&&&&&&%%%%%%%%%%%$$$$$%%&@@@%%%%%&$$#%%%%&&&&%%%%&&&9661--->,3::-;;;;..-<:444::<<:::::::::::::::::::<<<;<;;169&$$999&#O$$&&%++..,;;;<<,,,,,;-;<<;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+"2222222222222222>>>22222>>>>2222:33>>33-3------X99gg96.1..X.;,>>::::::::::::::::,,,33333:::::::::::::::::::::::::::::::::::::::::::;;;..X+++%9988 %+ + o                OOO@$&&$#%&&%OOOOOOOOOOOOOO OOoo@oo+++ooo       o   ooooOOO@@oOO  ooo   oooooooooooOOOOO#######o+++66661166666<-34:>;.XX;11699&%###%%%%%%%%%%%%%##%&&=&&#####%&=%%%&*888&%%%6+.1;;-----<2222::::,,,,,,,,::::::::::::::::::::::::::::::::::::::::,,:::::::::::::::::::::::::::::::::::::::::::,,,,::::::::::::::::::::::::233::<<<161.++.+++&*&&&*996<--,<<<<::::::::::::--:44:<+9&&&&9619&+++666111,,>>>--;---<<...++&&&$&&&&&&&$$$$$&&&@#$$$$$$$#@@#$$$#$$#OO$&##$&&$$$OOOOO#$&#O#&*&&*e*&$$$*t***&&&&e&&&&&&&*&&&&**&&&@@O@&&&@OOO#&&$&&&&&&$$&&&&***&****&&&&&&&&*e******&****eeeee**&&eee&&$$$&&$$&&&**&$OOOOOOO#&&**&&&%o   O@%&&%@oo    OO@#%%@OO@@@@OOOOO@OOOOOO@&#oo%&+ +98&%&&$&&&&****%%%%%%%%&&&&%###%%%%%%%%$$##$%&&@@@@@@@@##OOo#%%&&&%%%%#&%++...-;>>,,:::2><;;---:444:<<<:::::::::::::::::::<<<<<-;699&$$99&@OOO$&&&96X.;;;<<<<,,77,--;,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+"::::::::22222222>>>2222222222222>33>,>-,,-;77fff79971..16;;;,,>-::::::::::::::::,,,,,,,,::::::::::::::::::::::::::::::::::::::::,,:;;...XX++++%88&8% +                    oO%&$O#####OO Ooooooo#OO  OOoo%@o     ooo             ooo@ooo ooooo       oo  oooOOOOO#######ooo+699966969996<<::<<111166999&%##%%%%%%ooooo###o###%%%%%%###%%%%%%&*888*&%%++6611<<----2::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,::::::--:::::::::::::::::2,,;...699966++..+%%@&*%&996.-<<<<:::::::::::::.-::4><69*&$@+61+++X...X1111;;>,.;11;....+++@&&&&&&&&$$$#$$$$$$$OO$$$$$$&$$$$$$$#######$#$$&&&&&$#OO#$&&$#$*e&$*$&&&$#$&e*&&&&&*&&&&****&&&&**&&&%OO@$$@OOOO$&&$&&&&&&&&&&&&***********&&&******ee******eetttee*&*eee&&$&&**&$$&&&***&$#OOOOo%&8t8*&%o    oo#oo oo    ooo#%%%###@@@OOOOO@OOOOOO@&#o+%%+ %98&%&&$&&&&&&&&%%%%%%%%%%&%%###%%%%%%%%$##@@#%%%%%@@@@@OOOOo###%%#%%%%#++ XX.1,3,:---:,44>><;--:44::<<-::::::::::::::::::::::<>-<699&$$%%%#@OOO&&996;;,<<<<<<<<77,,,,,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+"::::::::22222222>>>2222222222222>,-:,--7<;7ffgf7.;;...;1;;;;>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,:;;;...XXXX+9ci&++%&+               oo    OOO OOoooooOoo%%%%%&$OOO##oO@ooo    ooooooooo       OOoooooooooooooo          OooOOOooooooo##%%%%666%%%%&9+.<<<;<166+%%%%%%%%%%%%%%#ooooo###oo######&%#oo##%%%%&&*&%%%%%%+%9++6661;.:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,:::::---::::::::::::::::5>;;.XX @&&&9999.;6++o@*&*t99+.X--<<::::::::::::<<,,2,1.%**$o X.++XXX.1.X.;..;1166666.XX66&&&&&&&&*&&$$$#$$$$$##OO$$&&&&&&&&$$######$$$#$$&&&*&&&&$$$&&&*$$&&$&t&***&&&&*&$$&*&&***&&****&&&**&&&%OOOOOOO$$$$&&&&********&&*********************teee**eeettttte*eeee**&&&&**&&$$O#&ett&#OOOooo&8yt8&%@oo    ooooooooooooo#%%%%%&&%@oOOOOooOOo@@@++o+++ X%98%%&&$&&&&&&&&$$$$$$$$%%%%%%%%########$##OOOO@%%%%%%%&&&&&%#oO%#oo####++XX.111,>----<<444>>,<-::4::<-.::::::::::::::::::::::>>:;699&$$##$$&%%@+69971;;>>>>>>>>33,,,,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+"::::::::::::::::>>>>>,,,>>>>>>>>-,--7,-773771,-X<<;;;....-;;-->2:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;....XX.+9hh%o&%  o              oo%%o     O   Oooo#%&&&&&&&$$$&&#o%%&&%+o    oooooooooooooo@@@++%++oo  ooo     o  o  Oooooooooooo###++++%%%%#@%++X<<;-;<66&&&%%%%%%%%%%######ooo##########*%#ooooo###%%%#ooo+%%%#@+++++...:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,::::----::::::::::::::::>,,1++@@$&&&&&&+;<<.X @&&&*889++;;;;<>>22222>>>>.;<;-;.Xo&e*&%+1.+++666.X..11667+%9996++%9**&&$$$&&&$##$$&&&&$$###$$&&**&&&&$$##$##$&&&$&&&*******&&&*&&&$&**&&t****&&***&#$&**&****&*****&&***&&%OOOOOO&***&&***************eee********ttte**etttteeetttttttte*****&&&&$$&&**&$$#O#&***OOooOo%&888&&&**oo   oo%oo@%%%##o#%%%%&&&&%@oOOOoooo@%%@%%+++   %9*%%&&$&&&&$$$$$$$$$$$$%%#%&&&%########$##@OOOOOOOO@%&&$&&&&%#O%%#ooooo++++11...;1161;.44>>,,,,:::::<--::::::::::::::::::::::>>>;169&$$$$OO@@++...11<-->>>>>>:::-:>,>-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+"::::::::::::::::>>>>>,,,>>>>>>::-7;-7f777<<<-;1,--;;,,<;;>,>>::>::::::,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>;<;;1X...11168%%y8          o        %%#o Ooo   Ooo#%&&&****&&&&***&&%%%%#ooo    ooo%oo@%%oo@@%%@+%%%oooooooo     oo oo  oooooooOoooooooo#%%%###oo@+X.;<;-;<6&&&%%%%%++%%%#####oooooo##oooooo%%%##o  oooo##oooo+%%oOOOOoo XXX<<<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,:::-----::::::::::::::::3,169**&$$$$&&@ ,,<.XXO&&$&&tt89..;;;>>2222>>><;X...;1. o%*e8899+999yy96.+669999#%%&&*8*&&&&$$$$$$&$##$$&&&&&&&&$$$$&&&*&&&&$$$$#$$$&&&&&************&&&O$*te*****&$$&&*e&$$&******************&&@OOOO#&*et*********etttt***tttteeeeetttttttttuuttttttttuuuttte******&&&$$$$&&&&*&#OO#&t#ooOoo#@%8t888tt%#o  oooo%%&&%%ooo#%####&&&&%@@oO@@@@&%@%%+++X +9&&&&&&&$$$$$$$$$$$$$$$$&%##%&%%##########$$#@OOOOOOO@%&OOO####Oo##oooo%++++6+.XX.6666+.3>;;161<;::::<<-::::::::::::::::4:::::>>>-.69&$$$$OO@+++...----->>>>>:::---:>:-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+"::::::::::::::::>>>>>,,,>>>>>:::;f3-fhf,;-<,--;-,<;-----::>>,222:::::,,3::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::>>:<<<11.1.X.169++%ihy&X                 o%%%#ooooooooo#*&&*8**&**********&#oo%&%%%###%&oo#%%@@%@%%@ooooooooooooo    oo oo      OOOOoOooo##########OOooXX;,,<<<<####o o+00+%%###ooo#####oooooooo%%%%%#  ooooo#%%%%oooOOO##Ooo+++<<<<:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,:::-----::::::::::::::::>;;69ter$$$&*&+ 42,<.XO@e&&&etut...;;>>2222>>;;; +++699%&&&&&889999&9999++%999%+&&$$&&&&&&$##$$$$&*&&&&*&&$$$&&&$$$#$$&&$$&&$$$$##$$#$&*************&&&&$&*&&*ee&&&&&&&&t*&$&**t*******ee*******&OOOO#&*ee***e******tttttt*tttuteettttttttuuuuuatttttttuuuuuttt*etttt***$$$#$$&&$***$OO#&#OO@%o 8uii8*&%%#ooooooo%&**&%ooooooOOOO@&&&&%%O@@@%&&@++ +   +9&&&&$&&$$$$$$$$$$$$$$$$&%##%%%@%%%%%%%%O#$$$%@O&&%###%&OOOOOOOOoooooo%&@+++%+++X+6696++1...+++1;;:::::<::::::::::::::::4:::::>>2-.69&$$OO$&&661;;---;;;>>>>>:::,>>>>>-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+":::,,,:-:--::,,:,>>>,,,,-->,3333f7711,<-;;;;;;;;<<<>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>><;;;;........XX9yhi9o     %          &%o%titoo  oo  o%&*****&*etttttuttttt8&&t88tt***8&#OOOOO%@oooo     ooooo oooooooooooooooooo@@@ooo##########ooo%961,;--<1$$$$#+++%%%%%##Ooooooooo###%%#ooooo oooo#ooo#oo    ooOOOOOOoo  X<<--:,3322::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,,,,,,::::::::::::::::--------:::::::::::::,,,>;.Xo@&rrr$$&&%+34,76+&er&$&euuu9+XX.;3>>33;-166889998****&$&&&*&*t*%@&**&**&OO%*e*&&*e****&$&*ee&$$&**&&*ee*&&$$$$$$&&*$$&&$$$$&$$$&**e********&&&&**&$********&&&&&&**e*&&$#&********teee***&&#%#OO$*ett**etteuttttttuttttuuttt***ttt*ttuuuuuapauttuuuuuiiiuuutttette**&&&&&&$**tt*&#oooooooo@88tyt8%ooooo oooo%&&%%%%&&%#%%o OO%&&&&&%@@&&&%%%+   ++++%%&&$$$$$$$$$&&$$$$$$$$$$@@OOOOOO@#$#@@##@@@#$&&$$$&&$O$$&$OOOOOOOOOooo@@@@@o++%&&&&&%%++++%%+6.;>:::::::::::::::::::::4:::::>2:>;66*&$#$&&++1<->:::>,,>>>>>>>>>>>>>>>:>>>>>>>>->3333>->>>>>>>>333333>>",
+":::::,,333,,::::>--->,>-333377337,;-;;--;;;;;;;;>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>;;;;;;;;;;;;XX+9yiy8       %  o     +8i8&%&& &8o oo o%&&*********ttuuuuuutttuuuuut*tt*$OOOOOoO Oooo oooooooooooo  ooooo   ooooo@ooooooo#########o%9997711,1<$$=&%%%%%%%%%##Ooooooooo%%%%#oooooooooooooooooooo     OOOOOo@%%%1<--<,,2222::::<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,,,,,,::::::::::::::::--------:::::::::::::,,,,;;.+@&&$$&&89+X4:,799&&e&&*etuu99996;;5>>;;1666&&&&****r*$$$$&&&**&&$$&&&$$#OO$&eeeee*&eee*&&*e*&&$&&&&$$&*&&&&$$$$$&&&&&&&&&&&&$$&&***********&&&&*&&$********&&&**********&*eeee****etttte***$$#O#*ttuteettteuttuutuuuuuuuutt*********tuuuuaaaiuuuiiuuuuuiiiittttte**&&*ee&$O&&*8*&#oooooooo%8*%o     o%%o   oo%%##%%8**&&&&#OOO#%&&&%&*88&+++   +++++%&&&&&$$$$&&$$$$$$#$$$$$$#@@OOOOO@#$#@@##@@@#$$&&$$$$$O$$$$@OOOOOO@@@%%OO@@@@@@%@@@$&%#oOOO$&%+.;<>4444::::::::::::::::::::::>22>;169&$$$@+XX.->:::>::,>>>>>>>>>>>>>>>:>>>>>>>>>>3333>>>>>>>>>>,>::>,33",
+",:-----:------,373>,33,-33333,,,;---;<;-;<<<<<<<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>><;;;;;;;;;;;..X+6988%& o8 o%%%+      &88%%&&i88t%X #o%&******ttuuuuuuuuuuuuuaaaauttte*$#OOOO%@OO@@O ooooooooooooo  ooo      oooooo  oooo####o####%9996711;..##$%%%%%%%++o#ooooo###oo&%%%#ooo%oooooo +oooo++o       OOO o+%++1<<-<::2442:::<<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,,,,,,::::::::::::::::--------:::::::::::::,,,>;;6+&&&&&*8996.::-<69*&rrreeeeeyyhg91;;1;..699+*&&&&&&&r&$$&****&$$$$$$&$$##$&r*eeeee*&eee*&$&***&&&&&&$$&&&&&&&$$&&&&&$&&&&***$&&*************&&**&&&&***&&**********e***tteettttttetttttutt**&&$#&tuuuuttuuuuuuuuuuuuuuuuuu88e********8uuaauuuuiaaaaauuuuaaaauaaauutt**ette$O&&8t8&#ooooo oooo       #%&%#o#%##ooo#%%8******&OOOOO@%&&%%+o o+  o+%%%%%&&*&&$$$&&&&$$#$$&&&&$$$$#@@@OOOO@@##@@##@@@##$&$$$$$$$$$$$%#OOOO@@%%%%OOO$$$OO$OOO$&$OOOOO$$%+X.;>4444::::::::::::::::::::::>232;;69&&*&+XX.;>:54:::::>>>>>>>>>>>>>>>:>>>>>>>>>>,33,>>>>>>>>>>3>::>,33",
+":::::::,337777fff777773>>>>>>---<;;;,,<<<<>>>>>>:::::::44:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>><;;;;;;;;<<>;..XX+%98i  8#88&%%        o&8&%ipi8&%o o%******uuuaaaaappaaaaaaappauttue*&$$$OO&&@OOOOOooooooo##oooo  oo       oooo     oooo###++ooo#%%+11.XXX.OO####o+%+oooooooo#%%%#o%%%#oo%%+ooooooo+ooooooo   ooooooo o+%+ 6<<-<:::442:::<<:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,>;16998*8&&+666.376669*$&reeeeeeyyy9661;;..199&%&******ee*&&*rr**&$$&&$#&$##$&eeeeeeeeeeee**&&&*e**&&&&&&&&&&$$$$$$$$&&&$$&&&&&&$&*e***eeee****&&***&&&**************ttt**tuuttttttuutuuttuuute***&&*uuuuuuuuuuuuuuuuuuuuuuuuuuutuuut8tu**uuuuuuuuaaaaaaaiuuaaaauaaautttttettt*&*****%oOoooooooo%#oo#o  #%%%%%%%%%oo#%&&**888***&&$OOOoo&%oo  %9++%&9*&%***&&$$$&&&&&$$$$&****$####@@@OOOO@@@@@@##@@@@##$$$$$$$$$##$%%OOOOO@@@@@OO$$$$OO$OOO$&$#@@OO$&%+X.;>2444::::::::::::::::::::::>232:-69&&99+..;,,::242:::>>>>>>>>>2222>>:>>>>>>>>::::::::>>>>>>>>73333333",
+"-:37777777773,77777,,<;;<<,,,<;;;;;<,,,:>>>>>>>>::::::444:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>><;;;;;<>>>>.;1.X+9yhz88  %%%%+ooo      +%%+888tii8 o%****etaaaaapppjjspppaaappauuuutte***&$OO@OOOO@####OOo#ooo                       oooo##++ooOo#%%++XXX++##%%%%%%%oooooooooo%%#oo##ooooo%oooooo++%+oooooo  o++++++  +%%%+6<..<:::442:::<<:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,,,1799996+....--;79998&$&reee*etyt86..1;XX.698*&$&&*reete*&&&$$$**&&&&&$&$#O#$&*******eeeeeeeeeee*&&&&&&&&**&$##$$$$$$&&&&&&&&&&&*****eeeeee****&****&**************etttttuutttttuuuuuuutuuuuutttt**tuauaauuuuuaiiiiiaiiiiaaaaiuuuuuuuuuuuuuuuutuiaaaaaapaaiaaaiuuut***ttteetee&&&&%%oooooo%%%%%&%%%&&&&&&8tit&#%%##%%&&*8888**8**&$#OOO  ooo o%%%%&&&%%*&&%$$&&*&&&&&&&&****&%%$$$$@@@O@@@@@@@@##@@#####$$$$$$$$@@#$$@OOOOoooOOOO$&$OOOOO#$&&&%++oo@%@+..;>2222::::::::::::::::<<<<<:>234:-169&96...;;::>:22:::>>>>>>>>>2222>>:>>>>>>>>::::::::>>>>>>>>3333333>",
+":,7773,,,,,-------<;---,;;<,,,<<;;<,,,,,>>>>>222::::::444:::::<<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>><<;;<::::::;,1;XX68hBhkyi0 %%+%%%o      o%%y%o8i8&*o#&ettuapppppsjjjjjjjsppappaauuuuteeee&$O@&&$OOO##$#OOOO                     ooo oooooOo++oO####%%+0oo+%#%%%%##%#oooo+oooooo@oooo@oo   ooo ooo++%%+oooo OOo++++X++X+++++1...-::2444:::<<::::::::::::::::::::::::::::::::,,,,,,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,:<<,6666.X..----;16++%&*&reee*8tttt&XX..6699*&$$&*ee&&&&&&&&&&&&**ee**&&&&&$#$&&&&**e*******eeeee*&$&&&&$&&&&$##$$$$$$$$*****&&&******ee*eee************************tuuuuaiutuuuuuuuuuuuuuuaiuuuuuttuuauaaaauuaaaapapppapppppaauuuuuuuuaauuuuuuuuuiaaappjpaaaaaauuut**tttt***&$#&&%%#ooooo@%*888888ttt88888ippu8####%%%&**88*&&*&&&&$OoO       +8**&&%%%$$###$&**&&&**8tt8*&%%&&&&&&$@@@@@@@@@@@@@##%$$$$$$$$$$$$#@@@@OO@@OooOOoO$&&$@@#OO#%&&%%1.XX++++.;;>>>>>::::::::::::::::<---<:>244:-166+6<..;;-->:22::::>>>>>>>>>2222>>:>>>>>>>>>>>>>>>>>>>>>>>>:>>3333>",
+":,3,:---::::-::,--;;--;,--;;;;--<,,,,,,3>>>22222::::::444::::<<<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2>>>>><<<::::::4,,;.XX++%y8chxhit8%+o%%%o    o%%&8*  &8###*tuuadssjjjjjkjjjjjsspappaaauuteeeee&&&&&*&$OO#$&$#OO#o                     oo+++ooooO@@OO#####%##ooOO%%%#oooo#ooo++o  ooooooooooo   ooo  oooo+ooooo  OOoo+++161XXX  o1...-,,24442::<<::::::::::::::::::::::::::::::::,,,,,,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,-----.....-<,::21.XX+@&errrr****e**%X+66y998*$$$ttte&#OO%%99&&*e**8tt8*&&&&&%&&&&&&***&*&&$&&**&***&&&**$&&&$$$$$$$$$$$$**reeerre*****ee***ee*************eetttttt*tuaauaaautuuuuuuuuuuuuuuiaiuuuuuuuaaaaaaaaaaappjppjpppppppaaaaaaauuaaauuuuuutuuaaaaapppppppppaaauuuuut*&$$$$O&&&%%%%%oo@%*8tyiiait8**8&%&8888o####%%&**88&#%&$$$&&%%#&%%%%&9yt88&&$##OO#O##&&&&&*8tuiiu8=%&&*&&&&&&@@@@@@@@@@@@#%%$$$&$$$&*&$$#@OOOOO%@@ooo@@@@@@%&%@ooo%%%%%>;..6666.;;>>>><::::::::::::::::----<:>2442>16+o,;-->,>-,:::::::>>>>>>>>>2222>>:>>>>>>>>>>>,,>>>>>>>>>>>:::>,3>:",
+"--::--:,-----::-,,;;<<--,,,,,<;;,,,;--::>>222222::::::444::::<<<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2>>>>><<<:::::44>;;111X   0%%hczki*   %%%%%    % %88%  &#&*tuuajpssssjjjjjjssppaaaauuauuuteette*&&$$$&&$$$&&$OO##ooooo  oo         ooo  +++ooooo@@OO#######%###O%%%o  oo#ooo++    oooooo ooo   ooo          o   OOo ++66..XXX++%....-,334442::<<::::::::::::::::::::::::::::::::,,,,,,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,<:<<---<,<-::::4.X+9y8&$r&&&&&&&&OOo+9ggg998errr8ttt&$Oo%999%+%&&&&888&%o%%%#&*88&&&&&&e&&&&***&*ee**&*t**&&$$$$&&&&$$$O***reeeee****e*****eee****&**e***ettttttuttuaaaauaautuutttuuuuaauuuuuuuuuaauuaaaaaaaaaaapjjjjjjpjppppppppppaaaaauuuuuuutuuaaiiiiapppppjjauuuuuutt*#OO@$&&&&%%#oo%@o%&888tt8&&8ijut888*%#o#%#o#&*88tt*%%*#$$&&&&&%%&8yy88***&#OOOOO##OOO#%%&8tuiiiiut88******&&$@@@@@@@@@@@#%&&&&&&$&*e*&#$#OOOOO%@Ooo@@%@OOO@&%o&%+%%%% 22;16666.;;>><<;::::::::::::::::-----:>2442311X >--->:--,,:::::,>>>>>>>>>2222>>:>>>>>>>>::>>>>::>>>>>>>>,>::>>:-",
+":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222::::::::::::::::::::::::::::::::::::::::::::::::::<-..X o    +9hhh90%% o%&%   X   0%99+ &%#*uppjsssjjjjjkjjjjpppppaauttueeee**&**&&&&&$$##$&&&#Oo+ooooO           111116++oo++11OoooOOOOOooo@%%+oooooooooooooooooooooooo o+++   11<<<.......++++@++.661,;;;116++24444444442:<<<<--------::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>::::::::::::::::::::::::::::::::::::::::---:::::::::::::::::::::+699973-34::---<.XX &yitue*ete&&#$$$$$$$&*&#$&$OO##OO&**8*&&*&$#$&**&$&*ette*&&&$$&&***e****&&&&rr$$&***8****r*&8******e****8ttt**eeeeeettttttuuyyyiapaaaiuu88ttuuttuuaaaauuuuuuiiiiiiaaaaappppjjssssppppssspppsjjsppaaaaaaaaaauuuuuuuaappppsjjjaaapauue*te$OO$&&$#&&%#%%88%%8u8qiuikkao0kkkkja*&&*t&$**ttt8*===$&&&&&&##$*ttttt*&$@OOOOOOOOOOOO*tttuiiipaiaaqqiuuuutt*&$$$#@OO@$$&&&&&&&&&***&*%%%#@OOO%@OO@#@OOOo#$$$$&&&@oooo52,..+@@ ..;>224>>>>>>>>>>>>>>>>2>>>>>>;,,771<---:::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222::::::::::::::::::::::::::::::::::::::::::::::::::<-..X     XX+6889%%%ooo%+o+o +  0%%%%+%%%8apppppsjkkkkjssjjpppppaauutettte*&&&******&&&&&**&$O%%+oooOOO         +1.;1++oOOo+++OOOOOOOOOoooo%%@ooooooooooooooo#ooooooooo+++   +<<..........XXXX.....<<;;;;16+++,>--:>22>:::<<<<--------::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>::::::::::::::::::::::::::::::::::::::::---:::::::::::::::::::::++...<,:---<<-....++9tuuaue&$O$&$$$$$$&**$#$&*&$#$#OO%&&*****&&$#&**&&&&**e*****&&&&&&***ee**&**rrr&****&&**eerr88***********ttt*eeeeeeetuuuuuuuiiiipppaaaiuutttuuttuuiapaaaaaaaiiaaaaaapaapppjjkkkkjjjjssjjjsjjjjjsppppaaaaaauuuiiiuuaaaappsjjjppppppauuue&&&&$OOO#&&&&88iiaiiakkjpjjp*jVVVVkkk*&&*****=*uuu8*=&&&&&*&$&&&*tut*t*&@OOOOOOOOO@%&&**8uiaajjjpauuuuuuutte*$$$@O@$$$$&&&&&&$&&ee**&&&@@@@OO@@OOOOOOo#%&&&$$@@@@@@@+42<..+@@+..-->24>>>>>>>>>>>>>>>>>>>>>>><<,31,;--::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222::::::::::::::::::::::::::::::::::::::::::::::::::<-...XX ++XXXX%%%&+   oooo+o    0o++%%%#%tappajjjkjjssppppjpppppaaaaueutt**&&*e******&&&&*&&#O%oo  oOOOOOOoo  OOo XX+ooOOOOOoooooOOOOOOooooo@@oo#ooooooooooo#%ooooooooo++++   ...........++.......;;;-;;.+++oo1....;<,>>::::<<--------::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>::::::::::::::::::::::::::::::::::::::::--::::::::::::::::::::::.....;;.<<176<.X+998ttuauuut*$@$*&&&&$*te#O&t*&&$$$$#%&%&*8**&&&$&&&&$$$$&&*&&&&&&&&&&&*eee***eerrrr****$&**&**e888**********ttteeeeetttuuuuuuuuiiiappppppaauuuuuuuuuuuipaaaaaaapaaaaaaapppjjjjkjjjjjjssjjjjjjjjjjjjjspppppppaaaiaaaaaaaaaapsjjjjspppppauiut&$&&&&&&*88888ihjhppjkkjpkkkkkkkkjjkkpppuuaijjppiutt&***&&&$*&$*tut**&@OOOOO##@@#&&*8uuipjkkpkkjpppppppautte&$$$@$$$$&&&&&&&#$&*e*&&8&@O@@OOOOOOOOOO%&&&&$#@OOOo@+++42;..+@+++.--:22>>>>>>>>>>>>>>>>:>>>>>>,<<,<;---::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222::::::::::::::::::::::::::::::::::::::::::::::::<<<--...XXXXXXXXXX+9     o  %o        +%%o%*uaapkkkkjsppjjsjjsppaaaaaauuutt****eee****&&&&&&&$#Oo     OOoo  oo  OOOooooOOOOOOOOOooOOOOOOOoOOooooo#%#ooo#%#ooooo#oooooooo o+%+o  ..........116666---;<>;;;..++@OO+oo++.11;<<::::,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::.......X..6996669yyiytuu*euaut&&e*&*&$*te&$&e*&&$$&$$%%%&&&&&&&&e*&#OO####$$$$$#@$&&&&&*eee***eereeee*****&%#%&t***t*********ttteeetttttttuuaaauiiiiappppppppaaaaaauuuaapppppppappaaaapppjjjjjkkkkkkkkkkjkkkkjjjkkkkjjjjjssppppaaaaaaaaaaaappsspjpppppaatuut*&&*&&$##&**8iiihkkjkkkkjkkbkspjjauakkkjuuapaauuuuaattt***&&***tuau*%#OOOO##%&&&&*8t8uiapjjjjkkkjjjjkkjppatt&&$$$$$&&&&**&&$$$$&&&&&*&%@OOOOOOO@OO@%&&&&&@OOOOO@+++ 42<.++++++<;:>22>>>>>>>>>>>>>>>>::>>>>,,,<;-----::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222::::::::::::::::::::::::::::::::::::::::::::::::<<<<<;;;..XXXXX+XX+%+o+    #*%#%o     oo%oo%*upjjkkkkjkkkkkjjjppaaaauuuautte**eee*&&&***&&**&&&$o  ooo  oo    o OOO@++oOOOOOOOOO##OOOoooooooo###o%%#ooooooooooooOooooooooo++o   ++++++16.;<<<,,3::>>2>>;;1++@$$#OOOO+++..;<::::2::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;.XX...+XX+99yyy8yyyteeeeeeuutttt****&&*****&**&$$&$#ooo&%%&****t*&#OOO#OO#$$$$#OO#$$&*eeee****ettttt******&#%*t***eee******eeeeettttttttttuaauuiiaaapppsjjsspppppppaapppppppppppppppppppjjjjkkkkkkkkkkkkkkkkjjjkkkkjjjjjsspppppppppapppppppppppsjjjppapau**uutete*&&*8tuappjkkkkknnkkbnkjknVbbnjsjpuuap*tuaaateuuutt8*8ttuiaaut%%##%%&&&&*8888tquapjjjpkkkkjppjkjpppaue&&$$##$$&&***&&&&$$$$$$$%%%%OOOOOO@%%%%&&&&&#OO @@@+%%++4><1+++ X.<<,222>>>>>>>>>>>>>>>>::>>>>,,,<----;<::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222::::::::::::::::::::::::::::::::::::::::::::::::--<<:>>>;;;.XXXX+XX++ooooo#=8= oo    oo %oo#%*pkjkkkkkkkjjjsppppaaaauuuuuuut****e*&&**ee&*****&*&oo%%oO oo   +++O@+++.XX OOOOOOOOOOOOOOO@@@@%%%#++%+ooo+   oooooOOO@@ooo+oo   o++++++++61<<---:4:4445:>>;1++@OOOO####@oX..;-::44::::::::,,,,,,,,::::::::::::::::::::::::::::::::::::::::::>>>>>>::::::::::::::::::::::::::::::::::::::::::::::----------::::::::--<69999++%8tttyt88ttteeuttaatt&*****&&$$*t&&*******&%#%&%#%*ttt****&$##O#$$&*&&$@OOO#&t**e****ett88***e**et8888****tttt****eeeetttttttuuttuuuu*88uuapjkjjjjssssjjjjssjjppppjjjpppsjjjppsjjkkkkkkkkkkkjjkkkkkjjjkkkjjjjkjjjjssssjsppppsssppssppppjjjppaapauuuuaau**==&%%8*ujjjkkpjkknbbVPZUUCVbbbkjjpppaaaaaau**uuuiuttttuiaauuu&%%%&&&&*8tuutttapjjkkkjkjkkkjjkkjpaaue&$$###$$&*****&&&&&$OO@OOO#&%OOO@O@%&&&&&&&&%@O  oo+++++.4><66+ XX.<,,222>>>>>>>>:::::::::>>>>>>,,<---<,<::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222::::::::::::::::::::::::::::::::::::::::::::::::--<:::223,,1.XXX.XX++  oo#=qu=o ###o   o+%%##%qpjkkkkkkjppppppppaaaauuuuuuute***e*******&****&**&oo%&#oooo   +++6611;;.....+++++OOOOOOoo@@@@%$#O++++oooo  ooooooOOO@@@ooooo ooo+oo+++++.1<,:::44:4225:>,166+@OOO######++..;--::4::::::::,,,,,,,,::::::::::::::::::::::::::::::::::::::::::>>>>>>:::::::::::::::::::::::::::::::::::::::::::::-----------::::::::-<7fgyytytttt***ttetuuteetuait&&&*&$$&&O&&*&&&*******&&&&&%%&ett*ett*&&&$$&&*eee&&#OOO#&&&*eeeeett8***ee&rettt88eee**t8t888teeeetttttttuut*tuuu****wapkkkkkkjsssjkkjjjjkjjjjjjjjsskkkkjjjkkkkbbknVVVVVkkkkkkkjkkkkkkjkkkkkkjjjjjjjjjjjjjjjjjjjjjppppsppaapjpu*upjpajjpaa*=*aaapkjkjknksbkkCCZCZCVkjspaawuu***tuuttiaiuiaaaaaaiiu*==*****uuiaaaaapjjjjkjjkkkkkkkkkkpau*&#O##$&&*eee***&&&*&$O@@OOO@#@OO@%&&&&&&&&&&&#OO     +....2:-16+XX..<,>:>2>>>>>>>>::::::::>>>>>>>>>----,,,::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222::::::::::::::::::::::::::::::::::::::::::::::::--<::4444>--..XX+++++  % #*asu==%&%#   o+%&%  %qjkkkkkkpaaaapjjjaaaaaauuuuutteeeeeee**&$*eee****o  o%ooooo   +++71<-->2,--<16666OOOOoooooooO@OOO++++oooooo++++oo OOOOOoOOoo@@+o ooooo+...;<::444:>3,>>,,79999%@@$##%%%++..;--:::::::::::,,,,,,,,::::::::::::::::::::::::::::::::::::::::::>>>>>>:::::::::::::::::::::::::::::::::::::::::::::-----------:::::::::-<799ytteeuueeutetuaueeeee*&&&8&&$O#*&O*$$**&$&&%&&&&&88*&%$&*tttut*&&**&&*eeeett*&#OOO$&*etttttt8*&*reeer*e888eee*8888888teeeetttttttuue*tuaauuuuuupjkkkkkjjjjkkkkjjkkkjjjkkkkkkkkkkkkkkkkbVbbbbVZZVbbkkkkkkkkkkkkkkkkkkkjjjkkjjjjkkkjkkkjkkkjjpppjjsppsjpu**ujppzVVkkppaw*waapkjkVkakkbUUVCVbnkjsauuuaaauuuutuuajjphjjjjjpppp888uuuuuappjjjjjjjjjjjjjkkkkkkjpjjpat&$$O#$&*tuute**&&&&&&$$$$OO#@OOO#&&&&&&**&%&&%OOO  o+++....2--<6....;<:--:2>>>>>>>>::::::::>>>>>>>:>---->>:::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+":::::::::::::::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::222222222222222222222::::::::,,,:::::::::::::::::::::<<<:444444>;...XX +++o  o*pjjsssau*%o    88=%o#qpjjkkpkkjauappppapppaaauaaue***&*******&*eee**&&&%@OOO@@%@oo+++X;--:,32:32>;-;16OOoo@++++oOO@$$Ooo oooo ooooooooOOOOOOOO@@@@@@oo#Ooo+++1..<,2444<<<;;;,,7666++++ o%%+++666;--<--:::::::::::::::::::-----::::::::::::::::::::::::::::::::,,,>>>>>::::::::::::::::::::::::,,,:::::,,,,,,,,:::::---::::::::--------::<<.++%&eeeeuw*&ett*$$&ee*&&****%#&&%%&*&&&%#OOoooooooooooOO#*tuttteettteeeeee*t8*&&#OOO$*ttttt*tte*reeeeettett&***8ty88888teee**eeettt&*tuuuuuuapawujbkkkkkkkkkkkkkknVVbkkbnkkbkkkkkkkkVbkbVVVVVVVbVVkVbkkkkkkbkkkkkkkkkkkkjjjkkkkkjkkkkkkkjjkkjjpppaaapjjjkkauujkVVkkpkkkpwwwuskkkbbkkbCUUCCCVVbsappajpuuuuuuijkkkkkkjjjjjjjjpppjjppjjjkkkjjjpsjjjjkkkkkkjjpaaauu*#O#&$&euuuttttte&&&*&$@OOOOOO$&&&&&&**&&&&$OOOOO o++++1..;<>>-..6.X.;<>>>>>>>>>>>>>>>>>:::>>,,,>>:--->,33,>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+":::::::::::::::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::222222222222222222222::::::::,,,:::::::::::::::::::::<<<:4444442<;...  +++   %*ipapjsau*$oooo &8=%#%*apapaupjuapjpapjjjjppaauauutttttee*****&******&$@@OOOO@%#@oo  XX.;<<11,>>2>;;..+ooooo+++o  OOOOOooooooooooooooooOOOOOOOO@@@@@@@@#OOoo+++..---::4..<;;;<,<<<<;....166116676;--<<-:::::::::::::::::::-----::::::::::::::::::::::::::::::::,,,>>>>>::::::::::::::::::::::::,,,:::::,,,,,,,,:::::---::::::::--------,:<-...oo&euuutweeuue&&e&&&&&***%*&#&t*O&%OOO###o@%&%%%%oooOO$*ettteettttteeeee*&&&&&%OOOO&tteetetee**etttettttueee8tyyyy8888*&&eeettttttuuaaaaaaapkjqqpkkkkkkkkBNxkkkbVkbkkbkknbkbbknkkVVkVCVVVZVZZVVVVVVbbbkkkbbbkkkkkkkkkkkjkkkkkkkbkkkkkkkkkkkkjppppaaauappaauuajkkkpkkVkjuwasjjkbbbkbbVCUCCCCnkssjpppaaauu*uuapjkkkjjkkkkkkkjjkkjjkkkkkkjjjjjjjjjkkkkkkkjjpaaut*##$$$&tiauuauttt**&&&&$@OOOO@$&&&**&*&&$$$OOOOOO o+++1;.;;,:><<666.;;>>>>>>>>>>>>>>>>>>>>>,>>>>>::--:>,322>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::,,:::::::::::::::::::::::::::::::::::222222222222222222222::::::::,,,:::::::::::::::::::::<<::4444442<;;..oo++o   iiaaapsspat&#o   o%%#%===w**=#upuuajjjjkkkkjpppaauuttttuteeee****&&&**&$%%#OOO#%#@oo    .+++++.<-;<;.X  @++o +++++ooOOOOOOOO  O@OOooOOOoOOOO@@##@@OO@@%%#OOoo++++...-<<,X.+...;<--------1111;;1671<--<<-::::::::::::::::::::----::::::::::::::::::::::::::::::::,,,>>>>>::::::::::::::::::::::::,,,:::::,,,,,,,,:::::---::::::::--------::<-..XX o*uuteutetteret$&&&&***##%&&&&&*&##&***%&&&%ooooooO$&**eeeeettttteete*&&&&*t*&OOOO*t**teeeettttyttttt8*ttttyyy999%&8**&eetttttuuuuuaaappsjjjjppjkxzzxccyyytuajkbVVVbkknbbZZVbkkVVkVVVCCCCZCZVVCZVbkkkbbbbbbbbkkkkkkkkjkkkkkkkkkkkkkkkkkjkkkkjpappaaaauauaapppjkkbVVVVkjaapsskbbbbbkbCVbbnVVbbkkkkkkjau***wupkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkjppau*&$&***euaau8aiuttt*&&&&&#OOO$&&&&&&*&&&$$$@OOOOOOo++++..-;>>:>,6666<<<>>>>>>>>>>>>>>:>>>>>,3>>:--::::>2222>:::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222244444444444444442222222222222:::::::::::::::::::<::2444444::<<<<Oooo    hpppuapaaau8*%o o %=%=8*=uuu**ajppapjkkkkkkjspppauutettttteeee****&***&$&&&&OOO$@@Oooo++O@@@@O++1166+oOO%+++++++6+++OOOOOOOOOOOOOOOOOOOO@@@$$$$$@OOOO@$&OOOOo@+++++666<;X.+6...<<,,,,,::3,,<;;<17<<-<<<-:::::::-::::::::::::::::::::::::::::::::::::::::::::::::,,,>>>>>::::::::::::::::::::::::,,,::::::::::::::::::---::::::::::::::::---<<-..XX%ttteuueee***e**&&***&#o#&&o&i&%&*8t8*%%%+oooo%oo#&**&****etttttttte*&OO@&**&#$OO$*etteetuiyy9+69yhpaitttt8996+X %8tteeetttttuttuuuappsjjpjkkkiiihhy99698yyippVVVVVVbVVbCUVbVVVVkjpkZAUCZVZZZCUUCVbkbVbbbbbbbbbbbbbkkkjkbVVVksjkkjsspuapkkkjauajjjkjapupkkkkkbZZZZVVVVjssjjjkkbbbbbVVbkbnVVVVVbkkkkjppuuapjkkkkkkkkkbbbbbbbkkkkkkkkbbbbbkkkkkkkbkkjjjpauu****tttupppauaaaauut*&&&&#OOO***&&&&&&&&$&&$OOOOOoo+++..-->24:>,16661<>2>>>>,>>>>>>>>:>>>>:>>>:---::>>22222::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222244444444444444442222222222222::::::::::::::::::::::244444:::<<<< Ooo   %uijpaaaa=*8t8&#oo &*%=qw#*uu**upkkkjppjjjjjjsppaauutttttttteeee******&&&&**&@OOOOOO@@@@%OO#OOOO+6666+@OO+++++++6++++@OOOOOOOO@OOOOOOOO@@$&&&$$$#OOOOOO#$OOOO@@@++++66++.X.666.;<<<::::::::::<<<<,<<<<:<>:::::---::::::::::::::::::::::::::::::::::::::::::::::::,,,>>>>>::::::::::::::::::::::::,,,::::::::::::::::::---::::::::::::::::---:,,:<;..%8ttuue*&&&&&ee***e*&o&&%&tt8ooo%&&#ooo+%%&%%%@o%&**&****eettttttte&$%%%&*8*&*&$#*uututuihg96..698888utt%++XXXXX+&8**eetttttu*tuuapppspjkkkjhq9+XXX.6+69yyipjVVVVVVVVVbVVVCCJVzkkssbVCUCVZCCUCCCCVVVVVVVVVVVVbbbbbbkkkVVkVVCCVZZVVbkjkjjjjjpu#appkkjjjpskVPUCZVZZCVVbkkkkkkkkkkbbbVVVVbbbbbVZVVVVVbkkkjkkkbbbbbbbbbbbbbbbnnbkbbbbbbbbbkkkkkkkjkkjjjjjpauutettttapkkjjupjpautt&&&&$@$$***&&$$$&&&&&&$OOOOOo+++...-:244>;;<<<<<,>24>>>,>>>>>>>>,33,>::>:----:>>22222455::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::,,,,,,,,,,:::::::::::::::::::::::::::::::::::::::::2222244444444444444442222222222222:::::::::::::::::::22222222:::<<<<< O#o  o8uijjpaau#%*88&o oo%=##=*tupauauajjkjjjsppppsspaaauuuuuuuttteeeee&***&&&&&**&&$$$OOOOOOO@OOOOOO@%+666+oOO  ++++66..+++@OOOOOO#$@OOOO@@$&&&&&$$@@OOOOOOOOO@@@@@@@%@+++++++.+661<<-<:::::::-::<<<<-<<<<>>22::::------------::::::::::::::::::::::::::::::::::::::::,,,>>>>>::::::::::::::::::::::::,,,::::::::::::::::::---::::::::::::::::--:::44:>-XX%yutt***&$&&**&&*e*&%oo&ty*o%###%#oo+%&888&%%%#%&*&$*****eeettttte&$*&&&&&&&&&$#&uatuuuiy97-3<;;1+%=au8o XX..XX+&***eetttttutuaappppsjkkkkh8961...<<69yyypkNVVVVZVVZZCCVPTBhkjkVZZVjbZCZCAUQUCZZZZVVZZCCCCZVVbbbbbbbkVVkkVUCVZZVVVbkkkjjjpat#upuajjjjjknZUUUAZZCUCVbkkkbVVVVbbbbVVbbVnbbbbVVCCCUUCVVVbbbbbnVVVVnbbnVbbbbVVVVbbbbVVbbVbkjjjspapjjkkkkjpaauttttuapjjkkapppatet**&&&$$$$&&&&&&&&**&$$OOOOOO@+++..-->444><<<;..<>224>>>,>>>>,,333333>>>>----->>222222444::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::,,,,,,,,,,,::::::::::::::::::::::::::::::::::::::::2222244444444444444442222222222222:::::::::::::::::::22222::::<<<<:,, #&%  %uphjjauu=&=**&%o o###%#=uutu*=*=*apppjkjapppsjpaaaauuuaauttteettt*****&&&&&**&&&&$$$$OOO@@OOOO@@6.;;;. @@+++...11.XX++@@OOOOO@$$$$$$$$&&*&&$@OOOOOOOOOOOOOOOOOOOo@@@@@@@@61.;<<--<,,,,,,,--<<<<<<--<,,222::::------------:::::,,,::::::::::::::::::::::::::::::::,,,>>>>>::::::::::::::::::::::::,,,::::::::::::::::::---::::::::::::::::<<::44444>-X+tyt8***&$&&&&$$*ee*&Oo8t&#%888*&&*88889%+%%%%#%&&&$&&&**eeeteett*&#@@@OOOOO%$$&*iituuu897,444>119ihiut%+666116988*eeeettttttuaaappppkkjjkh%XX.<<<<-7yhchpddVVVZCCZCCQUUTUh%kipVUUUbbZCCUUZU~QUUCZVVCCCCCCVVVVbbbbbVkVkaujVPVVVVnbkkppaaau*=uappupjjjkVVVVZCUUAUUZVVnbknVPCVCZVVVVVbbbbbbbVVbbVVCCUUCZVVVVVVVVVVVVVVVVVVVZCZVVVVVVVVVVnkjpaapjkkkkkkjppaiuttiapjppjkjauaat***&&&&&$@#$&&&&&&$&*&$OOOOOOO++ XX.;>2444>,176.-<>2444><<>>,33333,33,>::>--->>>>222224444::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::,,,,,,,,,,,::::::::::::::::::::::::::::::::::::::::2222244444444444444442222222222222:::::::::::::::::::2222:::::<<<<::, $*&  =ihphpuu*=*=&&%%%%#&#%**wpauu##==**pjpaapppapsjsppaaaaauuuttteettte***ee*&&&&&&&&$$&&&$$$&&$$$$@++11>;1+%&96+.XX....X +@OOOOOOO@$&ee*&&&&*&$@OOOOO@OOOOOOOOOOOO  OO@%&&&%@61..;<--<<<<<<<<<<-<<<<<.-<,2224:::-------------:::::,,,::::::::::::::::::::::::::::::::,,,>>>>>::::::::::::::::::::::::,,,::::::::::::::::::---::::::::::::::::<<::444443,.+9t*****&$&&&&$#&**=o&t*%&888tttt8ttty9o  o8+%#%$&$$$&&&*eeteeeee*&#@@%%@@#&&%&tiaaaett91-:4442>;19qtuiy999999998t8e**eeetttttuuaappjjjkkk8 X...--,,7cGWKNNNNNVVUQUUUUUPUBipJu*kVVCCZCZUQCkkkVCQUCCCCCCCCCZVCVVbbbbbNkkkjpkVVVVnbkjjppauuuaauujkppjpkVVVVVZZCUQQZbkbnkjjkbkjkVVkkVZVVVbkkbnVVVVVVVCUUUUUUCVVVVVVVVZCZCCCZZCCZCCCZVVVVVnkjjjjkkkkkjjjjpaauteeppkkjjknzp8uau**&&$$&$O O$&&&&$$O&&&OOOOOOOO++XXX.<34444:,777<;,>2444><<>>,33333-:::---:--:>,,,222244444::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,,,,,,::::::::::::::::::::::::::::::::,,,,,,,,::::::::>><;;;<>222><;.. @%   8paiqqu8%#qu8====#=#=uuuiai8=***=*=kVVku=psjjjspaupappuuaauttuutttte*****&&&&&&&&*&&&&&&&&$$$%&996..16+&&$%o++X;1X6+oOOO$$+++++%&9&&&%%@@O@@@OOOOOOO@@@@@@6.XX ++++++++...:::::::::::-------------::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::3444444::<<<,444>-::44443:..+9yitte&e*$&#==$$*=$$$$=**tyyi8*uueutt&+6<537369&O$r&&&&&&*eerree&%%$**&&88*eeeuuaaahh9.X11->>>>--7fg9611<;;.1699&&*reeer*&**euuaphpppkkku X1,-:3..9*uUZZQVZbVZCUUUUUUUU^z kkuikBkVUCZZCUCVbkkkVQQUVCZVVVVVVVVVVVVbVbnVVVVbbbbbbbksa*uppaappkjkkkkkkkkkkkkVZUUPUCVbkkkkkjssjjjjkkkkbnVVVVVVVCPPPCVVnbVZCCUCCCCCUUUUUCUUUCCCCCUUCCCCZVbbmkbbVVVVkkjjpautttuuuupkkkkkkaaute*&&&&%%%@@o$$$$OO$&$$$#OOOOO@+6,>::;..;<>445;16%@O ..;22>--,>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,,,,,,::::::::::::::::::::::::::::::::,,,,,,,,::::::::>><;;;<>222><;.. %&o  qpqiq8q*=*aaaiu*==*=*aaiiui8*=====qjkVVk8*skkjspa*wwuauuauuutuuuttte****&&&&&$&&&&&&&&&&&&$$&&9996..66+&&$&%++X...99%%###@&&99&&%%&&%@OOOO@%@OOO@O$$@@oo  1...+++++++.....:::::::::::-------------::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::4444:<-<<,3441,>::44:3<..+%&*tt*&e****=##=t*=====&**966++&*&rrdi+X-222>69t&$O$$$$&&&&*&*ee&&&reettttteeeeuuaahy6X.;;;>>>>--,776;.-;;-..1+++++#$$&*reeeeetaphpjjkkp* X.322319lkVZUQUUVVZAUUUQUQU~^!Vukk8=kUTUUUUUQQQUUUCZVbbbVCZVVVVVVVbVVbkkbnnnVVVnnbkkkkkpwuaaaauw*ppkkjjkkkkkppjbZVVVCZVbbVbkkkbksjjkkbkkkknVVVVVVPCVVVVCCUCVbbVUUUUUCCCCCCCZZVVZZUQQUCCCCVVVVVVVVnVVkkjjpttttaapapjkjpppjpatte*&&&&@oOo%&$$$#O$&*&&&$#OOO@@+1<::>;;.;;>24>;.+@OO++.--:>,7>>>>>>::::::>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,,,,,,::::::::::::::::::::::::::::::::,,,,,,,,::::::::>><;;;<>>22><;.. @@  oqaipiq8**uappjpq%=*=*iaaaaiiu*====qajnVVswskkjssaw##waaaauuuuuuutttt****&&&$$$$&&&&&&&&$$$$&&*9991;.66%&&$%%++6..69988tttt&9889%%+&%@OOO@$@%@oO@@@%@++XXXX;..166++XXX...;;,,,,,,,,::::------------::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,::::::::::::::::::::::::::::::::::::::-;>222<;.....-<:..---::--...+%%%tttett**&&=*uai8***&&%+6.XX +%&&rrt8+X;>>;19yye$$$#o#%%%&$$**&&&etuttutttuuteuapc9X.1;-2>:>>:--<-..-<,>--;;..X.+OOO@$&*e&&&*tappppjkat9+.33>-X.9kIPCPVQQCUQQQQQQ~Q//^^ZJxkxJUUUUQQQQQQUUCCCVbbbVkbZCCVVVbbbVbkkkbbkbbbbVkkkjjjjpkkkkkkpaaaaauapuupkkkkkkkkkbVbbnCCVVbbbkkkkbbbbkknnnnVVnVVVVCPPCUUCVVCCCCCCCCCCCCCZZCCCUUQQUCCCCCCCCCZVVVVnkjpaiuuuuapppjkkjpppppu**e*&&&%@OOO%&$OOO$&*t&&%@OOOO@+..-:>>;;;.;:>41;.+@@@@661,<;<1>>>>:::::::>>,,3::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>><;;;<>:42><;.. OO  %qipjpaiuuaapppji**q*8uuajjppi8*8*=quskkkjujkkjsssp==uppppauuuuuttttte***&$&$$$$&&&&&&&$$$$$$&*996...69&&&&$&&991X699888&@Oo      o%%OOOOO$@%@o@@%+++......;;;<111....;;;;>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::--------::::::::::::::::::::::::;;;<;-;.......11.X..;<<;..X++&&*euuuat&&&8uiiiiiy889++..1X.++%t8r$&yy96;1;;19yyy**&%++%%$$$$&&&&*ettiiuttuuetiahh9.;1;-24::::---<--:234423,<-..1++++@%&&&**&*tuuiuapuii9X;>>><.X k^TUPPUUUUUQQ~~//~U^^VBBNVPTQQQQQQUUUCZVVVZVVbbVbjkVCZVbbbVVbbbkkkkkkkkkkkjaajknkkknzkkjputeua*uaa**akkkjauuajkkVCVkknVkkkkkbnVnnnnnnnbnnVCUUCVUPCVVnnbnVVVVCCCCCCCCUUQUUUCCCCCQUUCCVVVVVkjpauijpppjjkkppaaappat*&&**&&$##@@OOO$OOO@%&&@++@@O@@++..-22><;;;;;>2..+%%@O@+67771;.::::::::>>>>>,,,::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>><;;;<>:42><;..OO   *qupjjjjppjpjpajjpauuuauajjaau*=**=sjbVkkkskkkkjssjauapaaauuuuuut**te***&&$&&$$$&&&&&&&$$$$$$&*996X..+9&&**ett896.9yyyt8&o +oo  oo%@OOOOOOO@@@@@%++X...;;,,2>>>;;;;;;<;>>>2--------::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::--------::::::::::::::::::::::::;;;;;;166%%@++69+++666616+++%**e*euuut**iy8%%69y99961.;-,-;1X69yeretihh..;;;;77f*8y89%%&&&$$$&&*$&8ttiuueee*tiiy97;;>>>244:::,<-,:::4444444:::-<..+66&9*tttt&&**t=eu*ui+.;>-:37<X8KI^[!^UUUUQ~^^^/^U!TBjkkVCUQ~/QQUUUUCCCCVVZVVbbVVbkjbVbkkbbbkkkkkkkjjjjpapauijkkjjjpaaaaau**utajkpu**=apjkjpqwupssjkkkkjjjkknVVVVVVVVnnnVVCVVVCVVnbbbnbbbbnVVCZCUUUUQQUUCUUQQQQQUCCCZVVbkkjppppjjkkkkjppppppau*&&**&&&$OO#&$OO$@OOo+++++++++++...->322>;;;;;,,.169@OO@++69961.::::::::33,,>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>><;;;<>>22><;..    o*qqpjjjjjpppkpapkkjppjjaappiut==*uuaakVVVbkkjjkkspppaaaaaaaauuuut***e***&&$&&$$$$&&&&&&&&&&$&&*89+X.X+9&&*eet889999yyyyt88*888*&&&&##$$$$$$@@@@+%++...;>223222>:-;;;;>>>244--------::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,--------::::::::::::::::::::::::..;;;1699&&&%&*8%%&99999%%&%%==*$===**8yi%XXX...661;;;>>>-<;.19geeetuii8XX;1>>23+98y999&&&&$$&*&&&**88*&&&&&8y86;<,-:23444:--,,<3,:444444444444:.;16666&&tte&&&&&#$&*ty+X.,,----X.hL^^^TTUUU~^^^^^/^!!PkVkkVU~QUQQUUUUUCCCZVVVCCVbbbbbkpkkjjkkjsjpppppaauuahi8*uau888*=***uuttt**appaappapjkkkkkkkbnVCVVbbkkkkkbVVVVVVVnbbnVVbbbbbVVCVVVbbbbnVVVZCUQUUUUCCCUQQQQQUUUCCCZVkkkkjppjkVVVVVVkkkkkdae*****&$$$OOO$$$@&&+++++.66666+.XX.-<3342><;;<,,,6696+o@9++6661..::::>>>>333,>>>:::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>><;;;<>222><;.. oo o=8qippsjjpppjpapjjkjjjjpppauut**wpkwwakbbkkkjppsspppuuaaappaauuuuttee***&&&&$$$$$$&&&&&&&&&&***89+XXX+9&&&*&&*899y899&%ooo+&&&&&%@O$$$$$$$$O@@@%%+...;>24444222>>>>>>>>>244--------:::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,--------::::::::::::::::::::::::..;;;169&&&$$&*tttuiiiy88tiu*===$$$#$&*y9XXX1<..;;;;>>22377,;<7ft**ut&*p+XX11223X+699999%&&&&**&***&&&&$$&**889+-:::::44::,--<<-:,,3244444444444><;;.1+++@&&$&&$##$$*ty8XX,7,,3:1XX69hRTTTT^^^^^^^^^TTPkjkVCUUQQQUUUUUCCCCCCVVVVVVbbkkkksssspppaauuaauuu8iai8&8y8**uuqquauupppauuapppauuapknVVCCnVVVVVVVPPPVnkbVVVVVVVVVnnVVVbbnbbbnVVVCVVVVVVCCZCCCCCCCCCCUUUUQUUCCCCVVVkkkkauuapjkkkkjkkjpaue**&&**&$#OOOOOO$&&996+....1111..X.-<,24442>;;<,77666++++9++......::>>>>>>,,>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>><;;;<>222><;.. #&%#=8q=qipjjjkpjpppppkkpppppjatuuu*ujVbkjkkkkkkjauapjppaaaappapaaaauttee***&&*$$$$$$$$$$$$&&&&**&&*9+XX +*&$&&$$ty999+      +%%%%%%#$$$##OOO##OO@@%%+X..;>244442222>>>>>>22222:::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,--------::::::::::::::::::::::::.;;;;;+%&&&==*tujjkkjpuuapkjpuw*=*=$$%%996.;<--3.->3332>7f7<<--7%uittttit%XX.-52.XX.6999%&**ee*&&***8tuu$etet8% 3::22:-:-,,<-;...;<<<:::344444::3>--;669%%%@$$$OO$$$*t8yy1X;-:3-;;1XX9EYTT^^^~~^^^PC^TVkkbVUQQQQAUUUUUCUCCCVVbbVbVVVbkjjpsjspaaauuuuuuuipi*  8iyaajkkkkkpiapu8ua*upkkkkkknVVVVVVVVCCCVVCPPPPVVCUCCCVVVCCPCVVVVCPVVVVVVVCCVVVVCPUUUUUUUCCCCCUQUUUCCCZVVnbkkkkp8*usssppppppautttee*&#&&&$#OO$OOOO$+666.X....-;;;;;-,,2>4442>>,,177....+++6.X..;--;>>>>>>>,>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>><;;;<>222>;;..o %88upiiqqpjjsjspsjjpapajjpaajjia*appVbbbVVVVbkjnkapjpjpppppppppaaaaaiue******&&&&&&&&&&&&&&&$$&$$&ty9  +&&&&$$&&**%     o%%%++%+%%%%#O$#OOO@##OO@@@++6.;<>2244222>>:;;<<>>>>>>:::::::::::::::::::::::::::::---:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::------:::::::::::::::::::::;;-;;..98****=upkkkksaw==askkkjpaut*&&&691X-,2:4<;:>232,7761;<>:X+8ii*&*ti8%66;11XX11X199**&&ette*$##*tee&rett%o::>>>><;;;;;<.666.67117-<,,,::--:>,,;.+6&@@@&&&&#$#O&t8%891;--3::3-;.LLhhz^^U~^/^'k V^CbVkkbVZCAUQQQQQUUCCCCVVnbVkbbkkkaupaau*uwuuuaaaphahhphckxapkVkjjpjkVVkbVkkkjjkkjuVPPUPPPVPCVVVVVVPPPVVPPPVCCCPPPCVVCVCPUPUUPCVVCCVVVVCUQQUQQQUCCCVVCCCVVVZVbbkkjspjjjat**uuaaaauuuuuue**&&&%$$$$$OOOOO@@@6+X....-;>>>>>>>>>>>2224422>;<6611...;;....--;;:>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::>>,,>>:>>>>>>>>::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>><;;;<>222>;;..  &ut8qqaapjjjsjjjsjsaappjppjkkkja=ajkVVVVbbbbkkppjkjppjppppppppppauuuutt*****&&&&&&&&&&&&&&&&$$$&&&*t8@@%&&&&&*$$&&+  o+@%%%@++oooO#$##$#OOO@@@$$@@+++6.;<,>244>><<;;--;;;<<<>>:::::::::::::::::::::::::::::---:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::------:::::::::::::::::::::->>>,;198**uuuajkjdpkkjapdaskkbkjppiy8961;;,:-:4<<::::>;166..->:1X+9iitt&ahhh9.XX171..1+88***tut***&#O#&e*uddpt8;--..;16;..1669989996661.....;;<;;;...++%%&&&***eee&$%*ty8+11,7442-,.cc98jT^~^~^^]VaVQUUCZbkjmCQUCCUQUCCUCCCCVbbkkVVbks*aauw==uuu==apuujuuihjkkkjjkkkkknkkkkbVCVZUUPVbnVbnVVPUUUPCCCCCVVVPUPCCPPVVVVCPUPCCCCCCPPUUUUUUUPCCVCUUQQQUCZZVVVVVVVVVbbVbkkkkjjpaut*&*t=*uauiiuuttt****&&%$$$$OOOO@@@@O66..;;;,>>>>>>>>22>>>>22333>-..611..;;;;--;-->>4>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>><;;;<>222>;;..  #%o#*uiaapjkbbkkjjjppjjppkUUbuau*pjpkVkkkVVkpua*akppjjjjpppppaauuuuutt*******&&&***&&&&&&&&&$$$&&#%*8&&&&&&&**rr**&%&*&&&$@@++ooo@#$$$$OOO%%%+@@+++X..;;<<::::--------<<<<<<<<:::::::::::::::::::::::::::::---:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::------::::::::::::::::::::::2>2,;1988uaaapjkkjdddaasjssjkVkchhiy96.X;,,:-44<<,:::;1X++XX.>21XX199*8ttupkh8+1XX;;;69y8&&*tt*eett8&*tietuapii99761.XX.+6999998*8t8899+++.XX..1.X.++++&*8te***eudpi**8*iy91.,33:-,.6h9%=kZU^~Q~^~U~~UQQUCVbbCQQUCCCCCCCCCVbbbVkkkksjsuasskjaa*=uppjkjpauijkkjjjkknbVPUUPbskbVCCUUCVVVZVVVCPPPPPCPPPPCCCUTUPPPPVVVVCPPPUUPCCCCCCCCCUUCCUCCCUUUCbbbbbbbbbbbbkkjjjkkkkjpaau****&*$*tttttt88&&$$$$&%#%$$OOOOO@@@++71..;;,3>>222>>>22>>>>>23332-..+11.;;>>>--;->444>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>><;;;<>222>;;.. o#  #*qwuapkVVbkkkkjjjjsjkVUUVj*u8au=upapkVVku#**uuupjpjjppppaauut***e**&&&****&&****&&&&&&&&$$&&&#@%&&&&$$$&&*eeet888t*&&$$%%%%%##$$$$OOO%&&%+++XXXX..;;;<<:::--------<<<<<<<<:::::::::::::::::::::::::::::---:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::------::::::::::::::::::::::2:2,;1988uaauaajkkjuwudassjkjkkch9661XX;;--:334.<,2>>16698+X.>4>--..X.+hy8upkkkcf11;X1yit&&eue=uuiy899888ippp*&69999999+%%*8888**8uiit8*&%+++++6++%%*8**tuuue*=&eakkju*$*ti9.-::::7<XgyitpVU!QQQUQQQQQQUUUQQUCCCUQUUCCCCCZbkspskkkjsjjasjppppppu=*pkjpjpapjkkjjjkbkjkVVUUVkbVCQUUUCCUUCUPPUUPVVUUUUUPCCCCCVVVVVVVVVCPPCCCCCCVCUCZVVZCCCCCUUUUCVsjjssjbVbksssssspsjkkjpuu*****&&&****8t8t8*&&&&$%%%##@OO@OO@++666<--;>,322222>>>42>><<>24442;;66++1;>>>>>--:>444>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>><;;;<>222>;;..  %**====ajkbVbskkkkkjsskkbVQ~Vkap8=w***papjja*=%u*#*pjpppppppaipaut*****&&*****&&&**&&&&&&&&&$$**&$&&&&$$$$$&&&$$&**&&&&&$$$&%%%@@#$$$$##%&99+X11...;;;<<::<<<<--------<<<<<<<<:::::::::::::::::::::::::::::---:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::------::::::::::::::::::::::,::,.19**uuuwwqppauupssauwskjpah91X....-;--:33:.<,2>>16ihi9X.>4,,3,-X.1.+988tpkhccg;X69hie*tut*tii9611XX %**$  X o%9**&*===*uppaaaapau8==**888888tttuuuuuuaauw*$&eupjpuatukzh7344---.zLBJPTQQQQUPUQUUQAUACCUQUCCAUUCCCCCZVVVbjajjjssjkpjjaappkjj*=ujkkkppsjkkkkkVVkpskbZUUUQUUQQQQUUUUUUUUQQUUU~QQTUPCCCCVVVVCCCVVCPUUPVVVCCCCUCCZZCCUUUUQUUUCVsbCUCVkkksaasjjjjjjpppppat&$$&&&&&&&8tt9+%%&**&&&&&%OOO$@O@++666<--;,>>22222>>>>42>;;;<>4442<166++61>>>>>;;;>444>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>><;;;<>222>;;..% #ij* =%akkkkbkkkkkkjsskjkb~^njjju=qpjkVkjja8**=u=otaajpppppppappauuttttte****&&&&&&&&&&&&&&&$$&&$$&&&$$$$$&&&&$$&&&&%%&$$$$$@o@@#$&&&&&&&996.X;;;;>>>>>:::--------:::::::::::::::::::::::::::::::::::::::::---::::::::,,,,,,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::------:::::::::::::::::::::<<--<.69&*wuuwwwuuuajkkssawpsapag7;.;;;<-<,,,:::-<:>>>11ihi&X;24::::42>;-19998iu.7ghf119ytt*euuu %96;;55719&&**tttttuuuuuuapdppsjjdapdaauuuuuuuuaapaaaaauuuapppa$re&*aspkppBBh9733-X.6HTITUUQUQQUUQ~QQQAAACCCCUUQUCCCCVbVVbVVVVbkkkkkkkkjkjkkppu=ww*upjskkkkkbVVnZUPVVCUUQQQQQUUQQQUUUUUUUUQQQ~^QUUUUCCCPUUUUUUQPCCCPPUUVVVCCCVZZZCCCCAUUQUCCUUCCCCCZVVVkkjkkkkjjjjppjjpue***&&&&&**89%+  +&**&&***&$O@$O@%666..---,,:::222>>>>>2>>;;;;>2443,166%++1;>>>;;;;>244>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>><;;;<>222>;;..%##up8o%#qpsjkVVkkkkkkkkpskpbVknjka*ajkVVkjpa*&&**%%8apjppppppppaaaaaaaauuttte*&&&&&&&&&&&&&&&$$&%$$$$$$$&&&$$$&&&&**&&&$$OO$$@O@@$&&*&&&&*9++XX:::2444444:::-----::::22:::::::::::::::::::::::::::::::::::::---::::::::,,,,,,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::------:::::::::::::::::::::<<--<<6y&*wuuuuuipjkkbkksjppaipa7,;>>-,7f7,,,--<--:52>;Xyau%X;34:--444445-;X 88#;X;ff;XX%8****uao .1127f5198yt8u8***tuappkkbkjddjksdsdadsppaaaaappdddddaaaapsjjjtut**upsddjkh.X---71<.9hKPVVUUQQUUUACAQQAAACCUUUCAUQQCbsVVVbkkkkkkbVVkjjjjappapuaupkkpjnbbbnVVVVbVUQQQQQQUUUUQQQQUAUQQQQQQQQQQQQUUUUPPPUPUUUUPUUUPCVVVCCVCCCCCCVVVVZCCCCUUCCCQQCZZZZZVVbbkbbkkjjjjkjjjat&*tute&&ree&@+ Xo%8yt8*&%%%&&&$#O@%6+...;-;,>::222>>>>><2><;.;;>2442,<+6$%++;;>>;;.;<244>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>><;;;<>222>;;.. ==*pa= #*askbnbkkkjjjkkpjkjVPkVkjqqjjajka*8u8*&*%%#%akpppppppppaaaaauuuiuuutte*&&&&&&&&&&&&&&$$&&&&$$$&&&*&$$$$&$$&&%%%#OOOO$#@OO#$&&$#&&&%+..144444444444::---:::::242:::::::::::::::::::::::::::::::::::::---::::::::,,,,,,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::------:::::::::::::::::::::-<--<69i*euaaaaaiiiajkbbskspjjj*>:>,>-3flf;-,,<<--:42311hja%X;24::444444421.X9u%61<;;..Xo&**=*aph%X;724727f9988auuuuapsjkbVVkkkbjkkjksddkjjpppppdauadddaaadppsjkNdu*8uskdkjdt+1;3-,-.X+yBICCUCUCCUCCQUCAAACCCUUUUUUCVVVZZZCCZVkjkpuaauwaaauappkkkjpskkbbbkbVVnbbUUUQUUQQQQQQAAQUUQQQUAUQUQQQQ~QUUUUUPPPUQUUUUUPCPCVVnbbbVVVCUQQUCCCCCCAAAACCAQQCZZZVbbkkkkkkkjjkjjjaaa8#&*ttt**tree@   X+9yy&OO O O@&*&@@@+.XX.1,<:>>::222>>>><<2>;;..;>:442,16+$$++;-;;;..;;244>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::,>>::>>,>>>>>>>>::::::::::::::::",
+">>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::o&#euwa=00%ikNNNksjkkjkjjsjkVbCVhjapbVbaskkpu##8#=ii==apppapppppaaaaaaaauuuute*&e**&&&&$*&$$&&&$&&&&&&&&&$$$&$&*&$$$$$$#O#$$$OOOO#$&&$@O&%+.....:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::---::::::::,,,;;;;;,,,,,<<<::::::::::::::::::::::::::::::::<3:-3ghipaudaaajauuupjbbkkkkaup#;-;77>;3733:::::::444333hhf7->53..;,33444433.+99g7--32:2,;698&*a8=0X.;->-796taaaqaupajpjkVVbbbbkMMbVkjjkkkkjpppatuuaaaaapjjppjknnVjwwskkkhhh7-44;->2>-79lIUUQQAQUCCCCCCUCCCCAAUUUUCVVbVCPVVZZnkkphpuuii8u8ihckxBkkkkbkVnsskUbdAAQQQQQQQQQQQQUUQQCQQUUQQUUUTTTTTTUUUUUPUUUVVVVVVVVZVkkkjjpkVZbVUUUQUCCCUCCCCUQZkbCCVVZVVbkkkkkkjppputut***ettut**g96.....6fff3::4>-X.9*$$$$#+.544<<::::::42::<---X.;<:4444:<-..@@+&6...<>:4444222:::::::::::::::::::::::::::::::::::::::::::::::::::,,:::::::::::::::::::::::::::::::::::::::::::",
+">>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: %*uuuau0%8ijkkNkjsjjkkkjsskVkVkjpqkVVVVnksajio#**iu=qpjppppppppppppaaaauuuutee*******&&&&&$$&&&&&&&&&&&&$$$$$$&&&$##$$$####OOO#$$$$$$OO&++....;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::---::::::::,,<;;;<<,,,,,<<<::::::::::::::::::::::::::::::::-,,:3fhhaaaddssjkpapkkkskskVkppa7,,73>>3--:::::4::444455f7X--733.;;>5527252,.6967<.-,::3>;698%$*i80X;1>:-71X*apdpspppsjjjkVVVVZZsbVbkkkjkkbkjjjpaaaaaappi88ajjjjnVkaussjsu861-::>:233:,69B~/QCAQCZCCUUCCUCZCCACCCCCCVVVVCVbVZVksiiapaq8uuiihknzxkbkkkkbkbnVkjVUUQQUUQQQQQQQUUUQQQUUQQUUQQQQUUPPPUUUPCCUUQPCCCUCVVCVbkkkkaapppkVCCCUQQCCCCCCCCksbCCZVVVVVVbkjppauuu**tttteeettte*6+XXX....17,-::4,;.198&$$$$+1>24<<::::::422::---..<::4444:-..+@@%6+...<>:5442222:::::::::::::::::::::::::::::::::::::::::::::::::::,,:::::::::::::::::::::::::::::::::::::::::::",
+">>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::X+8tuaap==8ipjkkkkkkjkbkkjjjbbns*uabPCCnkquwap&i88q8=ijjppjjjppappppppaaaauuteeee**&&&&&$&&&$$&*&&&&&&&&&$$$$$$&*&#OOO$$$$OOOO#$$$###@oo&++..;;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::----::::::::<<;;;<,,,,,,<<<<::::::::::::::::::::::::::::::::.<<;;79iapdddskjddawwwdjuujkkxp83::32-:2:::33333,334442>-..1;354<;;;;;5;1;116991..-,:::3>;169&$$88iv91-><7668aausjkjjjkkskbVVZCAbmkbkkjjkkbkkkjhpppaaaaaa=*jkkjjkkVksksskj8+.<,3:::44:-19B^^QCCbkbbZCUQQUCCAACCUUCCCZVVVUCCUPVkspjjkpuuuuaaijkkijjkkznkakVPsjUUUUUUQQQQQUUUQQQQQUQQUCUQ!UUUUPPPPCCPUUQ~^^QUCVCCCbnbbkkjkjauwuskVVVZCCCCCCCCCVssVVVVVVVVVVkkkauuuue&&tuttteettuuu++ XXXX...;--,,,>,;698&r$$$%6122<<::::::442::----<,,44443:-.++@@6++..;;>:42222>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+">>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;.98upasa=0qhppkbbnbkbbkjkjajbkwwpajbVnkbjka*= **8u8*akjjjjjjpaaaappppaaaauuteeete*&&&$#$&&$##$&&&&&&&&&&$$$&$$&&&#OOO#$$#OOOO#$$%##@@oo6+1.-;>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::-----::::::::;;;;;,,,<<<<<<<<::::::::::::::::::::::::::::::::..<;-.68ppduuapaauwudsspupkkBB8X4::::::2::::::::--::44>>;116,::42>>7f96X+666677..-<32::4>,16988&9ihhg7;,-7798iu8apkjkpjpjsjkVZZZCbkbkpakpjkkjspippppppaapuakkkjkpjVVbVkkjku X..,3:::4:<<9I^^~UUZbbbbVVZCUACAUUCCCCCCZZZCVVCUCVbbbVVkkksauaa8qhhipakknVkpakPkjUUQUQQQUUUUUUQQQQQUUUUUU~QCPCCPPCPUPUUQ!~~^QQUCVVVVbVVVbkkkjpuwuqusskkkbCCCCCCCZkkZbVVVbbVVbjkkauauau*&tt**eeeetuaatt8+  X.....;<<<;,;699*t&$$%+61;<::::::4444::::--:233322>;<6++%%6+.X.;<:>222>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+">>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3-66yjapsq=8ipjjkbVnkkkkkkksskjqsjsknbmjaaaq***%%8pa8akkjjjsppaauaapppaaaauueeeete**&&$$&&$#####$&&&&&&&&$$&&&&&&$#O####O##OOOO$###%%@+ 66..->>2::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::------::::::::;;;;;,,,<<<<<<<<::::::::::::::::::::::::::::::::<<<<-X6ycjppauuiaadsjkkjkkxxzc1X:::43:,3,,<---<<----:>,,7.XX;<33443fhhhitiy6.1,-<;:,24:4:,;.6yy8i8997733>;;.+8ipuuppkppuauajbVZZZVbju8tuadssspaiuapsjjjsppppppskaanbkbsjpju X..13::44:<<gE^T^UVVZVbbbbbbCCZVZAZbbVCCCCCCVVCCCVVVZVbkkbkaaaaupjkkkkVzknkkqjCUCPUUUUUUUQQUUUUUUUUUUUQ^QCVVVVVCCVCPCPUUQQQQQUUUQ!UVCCVVbkkkppuuuu***apjbCUCCCCZVbbVVVnbbbbbkskku*u*pau*e*&***&**ttuipi&O +9X..1...;;,;166%er&$$@++1:::::::4444:::::444422>;.166++@%66...;;:2>>>>>><::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+">>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::35;19paapsa==ijkkkkkkkkkkpapuawwpkmbVVbsmkswo#= #*pp*qpjjpppppaauaaaaaaaaauueeeetee***&&&&$#####&&&&&&&&&$&&&&&&$$$$$$#OOO#$#######$%@+++1.-->>4::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::--------::::::::<<;;;<,,;;;;<<<<::::::::::::::::::::::::::::::::<;;<;.69hhhjjhjkjkkjppjkjxcv97.1::::,:<------<<<..;;;;..XX166;-:44379yippkh6X-:4<--::444::-.69y8i91.;1377,;.X9hhuuapjjptuupjkbVCVnj8tiu=assjjjjjppsjjjspspawwuappakkjkkkkku=%9+X--:::-.XyJPPPkakVVnVVVVVVCCVbVVVbVCCZZCACZZZVVbbCVkbVbkkkpajkkxzVkkkkzzjppkUUPUUUCVVUQQUUUUUUUQQPUQUCnVCVnVVCCCCVZCCUUQQUCCUUQQUVCVnVbkkjpuuaau*u**ajbVVCCVbbbVVVbkkkkkjjjkpt*uuuut*e**tee******tuu&@%yi99996;.;<,;... %tr$$$%++::::::::444:::::444:><;..+6&%+%%61..;;->,2>>:;;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+">>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::435;68aapssuwwpjkjkkkkbbkkbbjkjksnnbbbVVCZVkwuut==aa==upppppppaaaappaaaaaaauteetee****&&&&&$OO#$*&&$$$&&&&&&&$$$$$$$$$$$O#$$##$$##$$%%++...-->>5::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::--------::::::::,,<;;;<<---;;<<<::::::::::::::::::::::::::::::::;--<;-16699&8ickjjjjkji8hlh1X;7>-----;;;..11..XXX.+661.X %hch617442-X %8tch6.->4<;-::444:>;..6999961;;,77,11169988tpcki88tajkkbVVj8ichiusjkbbbbbkkkjjjssjspaaaaakkVVkbVVVkaq889 ..--<<1+XhNkpwjUCZVVVVVVVVCCVbVCZCCVVZCUQQQQQQQQAZVVVVbkkjpjkkjjkjjkkkzjkjpjkbZCUCVVCUUZPUUUUUUUUPnbVPPVVVnVVCCCCCCVCPUPVVVVVVZPVCVVCCCVkjsu=8a8t*##*akbVVVbbVVbkjsssppapjkpuuuutt**eeetteeeeee**tt**tyhhgg971.;;,<-;XX+8*&$$$#@>>>>>>>222222>>>44::,66+++%%#o#%61.<<-->3,>:-;;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+">>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::47>11%ipsaskp=wjkjkbkkbbskVbjVbbsbVCVmbCVbPVkkauq*ia==uaappssppappppaaaaaaauueetee**&&$$$&&$OO$&ee&&$$&&*&&&&$#$$$$$$$$$#$$###$$$$#O$%%9X..-;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::--------::::::::,,,;;;;;---;;<<<::::::::::::::::::::::::::::::::,,,,:--<.6.XX9hcyii89699yg11;-,-..XXX1+%iihi89%+88ihhhiqiakzzhhh442,.XX  yy1.<:4,,32:444:,,;.16696X.113,7--;.161%%%hcxi%%%8ijkknci9yg998sjkbbbbbVbkkkkkkkkkjssssjjVVkjbkVkjpquiq++1.169yiiuwubUPCCZZCZZCVbVCUCZZZCCZZCCCQQQQQUUQUQUZVVbksjjjppjjjjkziqzBjnzknnkjkbVVUUUUUQ~QUUZbVnVCVnnCVVbbnVVbVVVVCPUPUPUUCVVVbVVVCUCVVVVj##uu*uu*ukVnbbVVVVVkssssppauakkpaae$tt**ttee***ette*euutyiy999771;;;-,,,,..6&&&$$$OO>>>>>>>>>>>>>>>>3::<6699%%#####%7<;,<-->3,>;-;;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+",,,,,,,,33,>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::44>,.+8ppadsaawabbbbbbkkbkkkkjjkwqnPVbkbCaVPbkjpiqj* 8jpjjpaappppsppaaaaauuu***ee*&&&$$&&$$&&**e***&$$##&$$$&$$O$$&&&$$OOO$$$$$$$$$$$%%+XX.;,,>:::::::::::::::::::::::::::::::::::::::::---::::::::::::::::::---:::::::::::::,,,::::::::::::::::,,,,,,,,::::::::::::::::::::::::<<<<<<<<<<<<<<<<::::::::::::::::,,:::---:::::::::::::::::<;.X19h9661XXXX.....-;;X6ihhhhjhjkjpjkkkkkkjjpajkkknxiX::>>;;..XXX.--:,>>>::444:::;;...111;;--;-,,;-;19..69996XXXX9hhhh96XXXX8pkbbbbVCPUQUCCUUZCCVVVVjsapkkbbbVVVbkkkkj88i8998*8pkVVVVVCVkbVVVbkVCCCUUCCCCZVVZCCCCUUUCVZZZZnkjappkjiiiqiiiaphkBkkkknnnkkjkkVPUPCVVVVVVVVVVnbnVVPVVnVVVVbVVVnnVVVPUUCCCCCCCCVCUZVVVVkkpuuiapjkkkkkbVbbbkjkkpw**=upjauau=**eeeeer&*e***tuett8*yy9.;;;;;;>;--<<;.X%$$$$$$O,,>:>,,<-<,,;-<,<--669%@%##&***=,<;---:>>><;;;;;::::::::::::::::::::::::::::::::3,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+",,,,,,,,3,>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::44:<.X9ippddskq=kbkkbbbkVkkjaajkssbCVbkbbwkZVCkj#8p==ippjjsppppaaaaaaaaaaaut***e*&&&$#####$&*eetee*&$$#$&&&&$$$#$$$$$$##$&&&&$$$$$$&$%@+....;<<<::::::::::::::::::::::::::::::::::::::::---::::::::::::::::::---::::::::::::::,,::::::::::::::::,,,,,,,,::::::::::::::::::::::::<<<<<<<<<<<<<<<<::::::::::::::::,,:::---::::::::454:::::::371X196.XXX;66..1..XXXjkzkkjjjkbnVVVVVCZVVnVVVZVVbCn  ::<>>>>>733,,<<<>>>::::::::;;;;;;;;;;;,3,,>;;177...1111.;.XXX0661XX.XXijkbbbVVVCUUAUUQUUUCCCUCVkppjkkbVVVVVVVVVnkaqiiiq=sVUQCVVCCCZCCCVZbVCCCCCCUCCZZZZCCCVVVCCCVVVVbksajphiqphhq8uihknJBBnnnVVVVVVkkbVkbnVVZZVVnnnnnnVVVVbbbbbbbnVnbbVVVVVVVVVbVbnbbVZVbkjpjkkkpppppjkkkkbbkkkkjjjp*==*=uuetppteee***&&er**ettt**tyyy9..;;>>>>>--:,<-..9&$$$$$$>>>>,,;;;;<;;;;;..66++@@$$$&*t8*,,;---:>><<;;;;;::::::::::::::::::::::::::::::::,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+",,,,,,,,,,>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3::<;.+*akkkpsqubVbnVnVbkkbnkjssksjnPCbbjwkbnVkkqpj=qappjkjssspaaaaaaaaaaaut***e**&&&####$$&*etttte&$$$$&&&&$$$&$$OOOO#$&&&&$$#$$$&&&@@+++...-<<::::::::::::::::::::::::::::::::::::::::--:::::::::::::::::::---:::::::::::::::,::::::::::::::::,,,,,,,,::::::::::::::::::::::::<<<<<<<<<<<<<<<<::::::::::::::::,,:::---::::::::444:::447453;X18g7;.XX.X6XXX9hclbVbkkbCCUUQQQUCZVVVCUACCAVZZQ!jq-<<>22247332:--->>>>:::::::::;;;;,111<--,;---->>-;;---;,-1111XXX61;1.1hkbVCCAUUUQUAQQQQQQUQUUCCVkjspskVZZVVbbbVVVbkbbkkbVVZZVVVCCCCZVVbVVbVZVVZCCCCCCCCCZZVVbbbbbkkkkjkkjiaiqiii88quiihhzBJJVBVVkVVnVVCVnnnVVVCZVCCVVVVVVVbbbbbbbbbkkkkbkbVbkkbbVbbbbbbkbkkpppjjaauuappjkkkkkjppkjjp*#=*#*uappu*te*&&&&&te**tttt**tt961X;;>22222-:,3:-.+9&@@@%&&>>;;;;....111111X.++++OOOO#&8tt8,>:---:><<<;;;;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+">>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,<-:;..+yupkkkpkVCVVCVVbbkbnkjjjsqwjCVbbksjssjjkkkkqappjkkkjsspappppaaaaaauue***e***&$$$$&**ee**te*&$$$$&&&$$$&&##OOOO$$&&&&$$$$&&&&&@+++1..--<<:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::---::::::::--::::::::::::::::::::::::::::::::::::::::::::::::::::::<<<<<<<<<<<<<<<<:::::::::::::::::::::---::::::::44::::443445.X9hv6166999XX 9hznzbbbkmCQQQQQQQQQQZbsbZAACZZAQPTTh--<>2444444>:--->>>>:::::::::>>>-,77ffgg971,,,>-->33:::,----19vhg7;;;6hhnCQQQQ~^QQQQQQQQQQQUCZAZbkjpsknVCVVVbbbVVVCPVnCUUZbbVUQQUCVVVVbbVbVVZCCCCCCCZVbbbVVbbbbbVbkjjjppjq8*%=*8*8uiihhhhkBJPVBzxVVVPPPCVVnnVVCCCPPCCVVVCVVbbbbbbbbbbkkkbVVnkkkbbkbVbkkkjkjpaaaaute*tuapjkkkkpuujpjh8%*uauakju&&***&&&eeeereettttet& XX;;,222444::,,:-669&&&&&663,;;;..X.+666666++++&9&++o++&999>>:---:<<<<<<;;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+">>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<::4>;.98ujjkhkUUCCCVVbVbkkjssjpqwpnVVVnbjupjknzpkkjjjpjjjpppaaaaaaaaaaauuue**&*&&&&$$$&&*ee*****&&$$$&*&$$$$$$OOOO#$$&&&&&&&&*&&&&+++...---::-:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::---::::::::---:::::::::::::::::::::::::::::::::::::::::::::::::::::<<<<<<<<<<<<<<<<::::::::::::::::::::::--::::::::4::<<::4:43-X6ihiqihhxBBkkkkkbbbkbVVCAQCCCCCCQQQUZVZAUAAAAAQU!T9-<:>2422444>>:<<>>><:<<<:::::>223,:;,7fg777,,>>:::,33:::3,>7gcxzf7--.6hhkVAQQQQ~QQQAAQQQQQCUUUUZZVksskbbbbVCZVbbVCUUCUUCUACAQQQ!QUCCUUUUCCVVZUUCUUUUUCCZVVVbbbVVbbkjkkaqq=uu8*$$%*tuihjkhhjxVJVkBVVVCVnVVVnnnVVVVVVVVVZCCZVVbbbbkbbbbkkkbkkkkkjpsjkkksjkksu**uutute***tupjjjkju8u8upitipkpppat*e*****eetrree**eter*& X.1;:>2244::::::<7999%+66663>-.....6+669996*&%&9y9666++1.XX:::-:;;<<<<<<<<<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+">>>>>>>>>>>:>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<:4444;19iy8iicVZVVCCVVVbbbkjpajpqajjkVbVksjjknzikkkjkjjjspaaaaaaaaaappaauue**&$$$$$#O##&******&&&$$$&&e&$$$$$O##$$$$&&$&&&&&**%%%+++.1.--::,::::::::::::::::::::::::::::::::::::::::::::::::--:::::::::::::---------------::::::::::::::::::::::::::::::::::::::::::::--------<<<<<<<<<<<<<<<<::::::::::::::::::::::::::::::::>:<<<<<::33XX9pjpppajnPPVVnbmmbbbVCCQQQACCCCCAQQQQQ~~QQQ~AUU!Yc0<<::>>>>>>>>::::;>><<<<<<::::42233:--.XX...----:,:--::::---7ff91>>->.1hkVCQQQQQ~QQQAAQQQQ/UQQUUUUCbkjkkkjkbVVVbbVCUUUQQCCAQQQQUUQUUPUPUUUUCVZUUCVVVVVVVCCCCVbbbkkkssbVkkjpkkpu$#&=&%%8ihphjkzBnzknBBBnnVVnkkkbnVVVbbbVVVVVVVVbbbjkkkkkkkkkkkspaaappaaapkkjpu****tee*&&&*tiaphi8%8*8iiippuaattaat*eeeeeer&eee***er$$&&66..--::::::::::<7996+..;<,;;-..1+++++%%+++&*8&+666611<;;..--::;;<<<<<>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+">>>>>>>>>:::>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::-<:44444-.X %hhhaussbCCUUVnnbkkjpaqq**aupkkjjjjknjkjkkkkjjjspssppppppssspauuee**&$#$#OO#O#&&&&**$$&$$$&&*&&$$$$$&$$$$$$$$$&&&&&&++++..;<--::44:::::::::::::::::::::::::::::::::::::::::::::::---:::::::::::::----------------:::::::::::::::::::::::::::::::::::::::::::--------<<<<<<<<<<<<<<<<:::::::::::::::::::::::::::::::::<-<.<<:33-X6hkkbbkjkCQUVVCCCAACQQQQACCCCCAUQQ~~~~~~~~~~QQ^^V8X1::::;;;;;;;<::::;>;;<<<<<<::4444-4377,;....;<,33,:---::,73;...XX52>319lnUQ~~~~~~QQQQAQQQA~CCUCAUUCVbkkkkbkkbbVVVbVCPCCUCCCUUQQUPPUPCCVVCUUCCCUUCUCVbbbbbVVVnnnbkVbkkVbkVVkkdadue&##%&8ihhjkkkkkxkknzkzVnnkkkkbnnVVVbbbbbVVVVVbbbbbbkkkbbkkkkpaaaaautuuupappau**ue*ee*$$&*8yi8*%o8&*88tut#*teett*eeeeerrrreeee**er$$&ey96<<:::::::::::-<66+.X.;>4;;;;166+++@@@@OOO&&+XX.;;>:>>,33--:;<<<<<<>>>>>>::::::::::::::::::::::::::::::::::,33,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+">>>>>>>>:::::>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::-<444444>11+X+1hsajakCVUUCVVVnbkpjaa8*u==wwujjjjkkkpkkkkkkkjsjjssssssssspauweeee*&&$$##$O#$&$$&*$&&&$$&&$&&&$$&&&&&$##$$&&**&&&&+++...-<>:444444:::::::::::::::::::::::::::::::::::::::::::::---:::::::::::::----------------:::::::::::::::::::::::::::::::::::::::::::--------<<<<<<<<<<<<<<<<::::::::::::::::::::::::::::::::<<-...<<---7hkVVMbkdsVCbCCQACCAAQAAQCCZCQQQQQQQQQ~^^//~U~QU^z 914:::;;...;;<,444;;;;<<<<<:::4444444:--;11;.-<::---<,<::---<<;..122-,7gzJUQQQQQQUQQQQQQQQQQkjUZZVUCVbkbbkkkkkbVVbbbVCVVCCCCUUUUIICPCPPCVVZCCUQUUUCVbbnVVVCVbkkkkkVbbVCkuppajkkkde*%#*888izkhhkxkkjjjjjnVkkkbnnnbkVVVVVVVVVbVVVbbbbkkkkkkkkkjsppaueue*uuuupauutt**e*ee*#OO**ii&%%o#o###&*&*$$*&O#*teee*rrrtereete*r$$$&ygy77,,::::::::-.XXXXX.<,24>,1166++ooOO@@OOOOO X.;->2444444--:;<<<<<<>>>>>>::::::::::::::::::::::::::::::::,3333,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,33::::::::::::::::::::::::::::::::::::::::::::::33f9hddkkJJnVVVVbbbbkpaaaq==8uaajbknsukkkkkjjkkjjkjjjjjjppaauuuutee*&&&&OOOOO$&*&&#$&&&$$$$$$$$$&&&&##%&&&&*&$%966:::-----::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::-3:3,7X.X8hjkkjskskksVQUQQAAQQQAAACCCAQQQQQQQQQQ^^^///~UQ~~~QAVs-->31;;;<-X7:474;1133:<<<..;;>:344434:33::----<<>,,,;;;;;;,>>>>2422X8kkV~QQQQQQQQQQQAAUU~QUCUVbUQ~AVbbbbkkbbbknVZVbkVCCnCVPCPPUCCQUCPPPUCCCPUQUUPVbbbbVCVbkjkkknVVVCVjskspskbbkku*$&*&$$kzkpkzknkkkkbVVVbbbbbbnVbbbbVVVVVbbbVVbkkbnbkjjksspapsspae=*euuauuut****&**&&&#oo&88&#ooOOOOOO$&$###OOO$eee**ee*eeer*&**rrr$$$edpt66-:44:::::,33333:::::X+&&&O  X67667<X>>>>>:::>>>>>>>>:::::3,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>",
+"::::::::::::::::::::::::,,,,,,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,33::::::::::::::::::::::::::::::::::::::::::::::,32;iudVVkPnbmmbbbbbbjaappiu8**ujbkVj#sbbkkkjkkkkkjjjjjpppaaaauutee&&$$$OOOO$&&&&&$$&&&$#$$$$$$$$&&$##$&&&$&&$%666:::-----::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::37:3-..9lxkkkkkjjkVCCQQUQQQUAAAACCAUQQQQQQQQQQQ~^^^^^/^~~~~~QQUZhfXXXX.X.773:445;;--::33<.X...X-23232:3-3:-:,,,-:--->,,;;;;-----4216qjkZCCQQQQQQQQQQQQUUQ~~UUCVCA~QZbbbbbsajkkknZVVVnbnnVCVPPPCCUQUCUUPPPCVCUUPCVCVbbVVVbkbkkkkbVVUUVjkVbVVbVVbkjae$#O#&&kBkjnzkkkkkknVnVnbbbbVCVVbbVVbbVVVVbbbbkbbbkkjksspaapppaueeeetuuuuuttt8******&%#%*&%#o#$####$$$$$&**&*e*eterrr&eeeeeeeterrr$$rtki9..:34:::::,33333:::::.+9&&@O .66<<<<.>>>>>>::>>>>>>>>:::::3,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>",
+"::::::::::::::::::::::::,,,,,,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::,,5;9uuVPkPPCVVZVVbVVbjpjkjjpuqpkbkVb=jbVbbkkkkkkkjjjjjpaaaaaaauee*&$##OOOOO&&&&&&&$$$$##$$$$$$$$$$$$$&&&&$$%@++..:::-----::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::4:-1X.9cxzbnVVbbkbVCUUUCUQQACCCCCAQQQQQQQQQQQQQ~^^^^^/////~QQQ~Q)EBhhhh9+XXX7>37333444:-.XX+99hc71.1--7,--,,--::3773:-::-::3333373X9cjkjbVCUQQQQQQQQQQQQU~QZZVbVZQQUUCVbbbkppkkkVVZCVbbVVPCPPPVPUQPCUUPPPCVVCCCVVPCVbbkkVbVVbbbVCUQCksjbZUZbVVkkjdpu*&$##8kxkkxxVbbkkkbbbbVVVbnVVVVVVVVbVbVVbbbbkkkkkjjjsspaaaauuuuue**e*ettt8********&&%%%%##%%$$$$$$$$$$&*eeeteettuutrtttttttterrrrrrrjh9..:44::::::,333,::::,++6&&@+ .11--<;.::>>>>>>>>>>>>>>:::::,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>",
+":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,::::::::::::::::::::::::::::::::::::::::::::::::3;9iakZVnVVCQQZbbbbbkppjkkkkkkbbbVVjbkbVbkkkkkkjkjjjppaaaaaaauee*&$##@OOO$&*&$$&$##$$O$$&&&$$$$&$$&&&*&&%%+++...:::-----::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3:31X9kBVVVVVbbkkbbbVVVCCACCCCCCQQQQQQQQQQQQQQQ~~^^^/^~~~~~QQQQQ!^!UUTTIJhh6;-->--:444:-X9qjnJIT}xXXXX1X;;,,>>23:4444::333,:::::-;XhkkVVbVVCQQQQQQQQQQQQQ~~CCCVVZZZCQQUCVCZksskkbbVPUPVVCUPVPCCPUUPCPPPCCVVVCCCCUUUCVbbVUZCZVVVVUUUVkjkkPUVkVbkjpddpaue$tOtkxkhknnnbkkkbVVbbbbbVbbbbbbbbbkbbbVbbbbkksssspppaaauuueeeeeee******==&&&**&&%ooo#%$&$O##$$$##$$&&&&*tutetdddttttuutter&rrrrreui9.;<:4,:::::::,:::::,3..++++ X.<<---;-:::>>>>>>>>>>>>>:::::,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>;.9hpkUbP!!PnbbbbbbkppkpknVVnnVnVVVVbbVbbkkkkkjkjjjpaapaaaautee&&$$##OOO#&&$O#$#OOOOO#$&&$$$$&&$rr&&&*&%++....-:::-----::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3>;XXinnVCCZbksskbbVCCCCACCCCCAQQQQQQQQQQQQQQQQQ~~^^^~~~Q~~~QQQQ~~QQUAUU^T!zX171334444436xBU^~^~^TBk80+.1.X-;>>-3444373-:--::3331.9hzVA~CUCCUQUQQQQQQQQQQQ~~/QVVZCZZCUQQUVVCVkskbbVCUUPVnPPnPCCCUUPCPPCCVVVVVCPUUQQQQUUQQCCCVCCCCUCVbVVVUZVVZVkkdjdaaat*&**tkxaikbnVnbnVbbbkkbVVVbbbbbbbbkkbbbVbbbkjpaaaaaaaappaue***tte********&$$&&%##oo#&&&$$#OOOOOOO$$$$&&*tuereadautttuute*&eeereetei8+.--:::::::::::::::,,..+66+.X.<,--;--:::>>>>>>>>>>>>>:::::,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;>-1hhjVVCT!YJVnVbkksskkpjkbnVCPVCZCVVbVCVbbbbbbkjjjpaappauuue**$$##OOOOOO$$OOOO$#OOOOO$$$$$$$&&rrr&$&&%%+..;;;<:::-----::::::::,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>,,>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::-.X9kPCVbVbkskkbVCCQQCUCCCCCQQQAAQQQQQQQQQQQQQ~~~~~~~~~QQ~~QQQQQAAAAAQQUU^I0XXX<<:444:-hY!~/~~Q~^^^^^IhXX11;;174333--<,7<---<<-XX8kVZUQQQQQQQQQQQQQQQQQQUQ~^~ZVUUUAUUCVCVVAUVkskbVVVPUUbPVVCUCVCPPPCCVVCCCVVCUUUQ~QQQQQQUUUUUCZZCCVbVVVUVVUUVkkkkjpaut*$t& ujiijbVVnbbbkkbbVVbbVVVVVVVVkkbkjkbVkkksauuuauutuapput*=*et*********&%%&&#ooo%&***&$&$$OOOO#$OOO#$*t*reer*eurreetter*eer*reetiy6..-,::::::::::::::::;<6696..-;>22>;-::>>>>>>>>>>>>>>:::::,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::1>359hpjVa%h|KTnbksauupkssjkbbCUUCVbVVVZCCVVVVVbkjjjpaaapuuaue**###OOOOOO#$#OOO#$#OOOOO$#$$&&&&*$rr$$&&%+1.;;-;,:::-----::::::::,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>,,,>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3,<1lPQQCbmsssbVbCCCUQCCCCCAQQQQQQQQQQQQQQQQQQ~~~~Q~~~~~~QQQQQQQAAAAAQQAQQQUk%  .XX-:4:.vT^QQQ~~U~QQ!^^IBJJzh6XXX-;.X.69y966...XXixZVV~~AQQQQQQQQQQQQQQQ~QQQ~~QQUUCAUCVkZCUUACbsjkbnVVUUCCVCPUPCVCPPPCCVCPPCVCU!QQQUQQUUQQQQQUVVZCZVbbbkUVV~UVkkkkkkdattt*$O#&8kjzVnkkkkkbbbbbbbkkkbbbkkkkkksjbbkkjpaauuuau8*8tuuu*==***&==***==*%%&&#o#&&*ee*&&&&$$$$$$$OOOOO$*&&ete&*e&$$&eeee*e*&&reeuipy6X;<::::::::::::::::;,6776<-;>422>:<>>>>>>::>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>",
+":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::-<-755hpjZa XX6BPkkjauupjjpjkbbVUQVbmVbVVVZZZCZVbjjjjpauuauuaae==$$OOOOOO#$$$###$#OO##o%&o%&****e$rr$#$&%1.;>2::,:::-----::::::::,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>,,,>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::4:-1xnnmssmVVVVbmbVCCCUCCAQQQQQQQQQQQQQQQQQQQQ~~~~Q~~~QQQQQQQQQQAQQAAQQQAQQQ^ZVVxh6.-,11XJ!Q~~/~~UU~~T^^^^^[]^Kxc96+9y8&yy8yhcclBTUQZV/QCUQQUCQCQQQQQQQQQQ^~Q^^^~~QUCZZCQUUUQUVkkkbVVVCPQVVVUCUCVVCPPPPVPPPCCCU^^QUQQQUQQQUUQUVZVVVbVVVbUbVUZkkkkkjjduuat&e&O#thaknkkkkkskVVbbkskkkkkksakssskkkskjpppaauuppi*&&*8tt*&*8t#%=***==*%%&&%#$**eee***&&&&&&&&&$$$OO#&*&&taue&$#OO$*re&&&$&ee*tuhh9.;;::::::::::::::::-,1761;->5444:>,>>>>>:::>>>>>>>>,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<>2459haVk0111cJbkkjauawpapkkkbVCVbbbbbjakVVVbksjjppauuuuuuuue*&#OOOOOO$$$$$$$#O%%%%%&&&99***&&&$$$$OO#9.;;>222::::::---::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>::::::>>>>>:::::::::::::,,,::::::::,,,:::::::::::::::::::::::::::::::::::::,,:---::-::-:3,-:3-1xjassmmbbbbnVCCCCCQQQQQQQQQQQQQQQQQQQQQQQQ~/~~~~QQQ~QQQQQQQQQQQQQQQQQQQQQQ~~~^Iz9XXXiT/^/~~~QQQ~^~~~~^^^^[]]]^IJPVk*e$aV^^{^^^^U~QUQAUQQQQQCQQQQQQQQQQQ~~~~~/^~~QUUU~UZQQTCVkkjbnnVbCPPCVVCVVCnVUUCVnnPPVP^T~QUUUUQQQCUUQUUVbbCUZVVVZVZZkkkkkkdaapautt*&#O#&pppjkkkjskkVVbbbkkjssjkksjjkjsssauappppujpkkkhhittiit**88=*t==*%*%%%o%8e*eeee**&&&&&&&&$$##$&&*eeeeeetee&$O$*e&$&%$$&*eetpch9..;::::::::::::::::>>,,<<;-244442><>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::--4457hkkk X919HbkkkpuuuuuuajkbVVbbnbbbkskkkkkkjjsppauuuuuuut**&#OO###$&***&$$#O%@+++++6+++%&&&%@%&&$$&9+1>>222::::::---::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>::::::>>>>>:::::::::::::,,,::::::::,,,::::::::::::::::::::::::::::::::::::::,,,,,:-33,----:4:-XinCVbbbbnnBBZCCCCQQQQQQQQQQQQQQQQQQQQQQQQQ~~~~~~~~QQAAQQQQQQQQQQQQQQQQQ~~~~Q~~^^IchhI]^~^^~^^^^^^~~QQ~^^^^~~U^^^/^UV=dZZ~^~U^!!UUUQQQUQQQQQQQQQQQQQ~~~~~~~~~^^~~~QQQZUUU!^IInkbkbkbVnCCVbbVCVVbbPTUPVnVPPUTPQUUUUUUUQUUUUUUVbbZUCVbkZbVVkkkkjkjdppauette*&$$&*upjkjpkVVbkbbkkkkkjkkjsssssppsbkpaapppjkkhihkhku8ap8*u8=*t*==#8&&%o%****ee******&&&&$$$##$&&**e***ettt&&&&&&$$&%##$*eeajkh9..;::::::::::::::::>>,,,<-:24442><;>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::--232;9xkz9XXXXcbbkkpu*uu*=*ajkkkjbVbkkkkbbkkkkkjspauuuuuutte***e&$&&&&&88*&&$$#+++XX......+++++++%&**&&+1,>22:-:::::---::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>::::::>>>>>::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::--<,,,;----;,,,,-7.XlVVVbbbnVVVBCCUQQQACAAQQQQQQQQQQQQQQQQQQQQQ~Q~~~QQAAQQQ~~~QQQQUQQQQQQQQQUUUUQQ~^^^)[[[^^/^^^^^^^^^^^~~//~QUUQ~Q~~~/~VZ/QA/Q/^!~UUAQQQUUUUQQQQQQQQ~~~~~~~~~~~~~^^~~QQUUVkxzlTVnVbbkbVbVUUUCnkVVVnVPPPknVJPUUUPUUUUUUUCUUQUQCbbbVCUZVVVkVkjjkkbVbkjdpputttte&$O&**tapjasbnkkkkkkkkkkkkppsppapjkjauuaapatihhytihhhpit888*8ut*=#8t*oo$&****&&&*e**&&&$$$#OO#&&***&&&*eee&*e*&$##%@OO$&*eeihy6.-,::::::::::::::::>>>,<;-:24442>;;>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::-,>22-1hxxl8X.19nnkjja8eu*==*assssbbbkkkkbbkkbkkjspuu*uuuuteee**it&%%+++66%&&%%@++.XX.............+@&r&&+6;>>::<:::::---::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>::::::>>>>>::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::<-----;,;<,,<;;-6;X9HBkCVVVCCPPPCCQQQQACCCAAQQQQ~QQQQQQQQQQQQQQQ~QQQAAAA~~~~~QQQQQUQQQQQQQQQQQQU~///^^^^^^^//^^^^^^^^///^^^~~~~~~~~/~QQAZUQQsU~~T^UCZZUQUCCCCAQQQQQQQQQQQQQ~~~~~~~~~~~QQUVi%0X.FUPbnnbVVbVVCUPVkkbnnVPPJnCJJPCCPCPUUPCCCUQQQUUVbCCZVZVVVVkkkkbVVVVVkkdpadutette*&*&##&ua==knkkkkkkjjjkkjpppppapsspaaaappkjiuii8&ikNkhiu8**8uut*&8i8o#&$&***&&&*e*&&&$$$$##O$&&*e&&&&&&&&&*e*$OOO@@OO$$&&#*891.-,::::::::::::::::>>><;;-:2444><;;>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>",
+",,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::.<-->--1fhxz891;kVVkkjut*e*==uaasjbnbbbkkkkjpsjkjjpauuuupautte**y9++..X..166++++661;;-;<,<;;;...5-.o$rr&%61--:<<:::::---::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>::::::>>>>>::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::,;-<<-;,;77;X-,7XX9nJVVVVCCVVCUQQQQQQQAACCAAQQQ~~QQQQQAAQQQQQQQQQQQQQQQ~QQQQQQQQQQQQQQQQQQQQQ~QQQQQ//^^^^^^^^^[^^^^^^^^^^^~~~~~~UQQ~~QAbbUCUskQUT^VbVCQQUCCCCAAAAAAQQQQQQQQQ~~QQQQ~~~~~^Vi%XX.X7U!bVnbVVVVVVVCCCnkkknCJVPPVVPPVVPPPCVVVVQ^QUPUVVQQUCCZVUVkkbZUZVZZVVVkjddpuuuuue&re&&&&&**jaakkkkssspppapaaapaaapppauuaphhpihhyyhkBBxjii8**8t*=&8t&o&&$&&***&***&&&$$$$&$##$&&**&&&&$$##&&&&$$OO@@@$$$$$%&96.--:::::::::::::::::2>:----:2442>;;.>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::-<..,355-9hNx8X1inPBkjit&**==qaaqsbbbbnkjkkkpuuajjspaaaaaauutte*96...-;,-;<11..X1,<<:::44:::<<<<42. @rr&&61--<<<:::::---::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>::::::>>>>>::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::<--,,--;73;-;,;X hnPCPVVVCCCCCCQQQQQAAAAAAAAQQQ~QQQQQUAQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQCCQQQ/~~~~~^^^/~~~^/^^^^^^^^^^^^^^^^^^/~QQ//VV~~~U=nTTUjjVUQQQCCCCAAAAAQQQAAAQQQQQQQQ~~~~~~^^PiX.17--kUVUVbVVVVVVCCZVVbkjjknJPPVVPPVCCCCVVVVVCUPPPPVV~~QQQQUQkbZCUQUCCCCCUZVkkjdppaaureeree&#8*tuakkkjsjkjspuppappaaauaaauuuu8tihc89hikBzkhhitt**8*%%&*&$&&$$$&***&&&&&&&&&&&$$#$$&&**&&$#OOO&&&&&$$#@@$&&&$$&996;-:4::::::::::::::::2>:---;>222><;..>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>",
+":::::::,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<-.<;33421+jkh970ixBxjat$&&==8iaqakkkbbkkkkkkuwujkkjppppauuutt*$1;;<,>334>>,<;..---::444444:,,,<44;XOrrre96;--<<:::::---::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>::::::>>>>>::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::7,;,;-;1g7--1,-;bUPnnCVUCQQQQQQQQQQQAAAAQQQQQQQQQQUQUCCCQQQQQQQQQQQQQQQQQQQQQQQQAQQQQQQQQQUCCQQQQ~/^^^^~~~~~^^^^^^^^^^^/^^^^//^^~^~~Q^~k!^^!TiiPCkqkbVUUQUUUCAAAQQQQQQQQAQQQQQQQ~~~~QQ!![HX.,-440bUPCbbbZVVVVVbbbbkkkknUPPPPJVVVVCCCPPPPVCPPUVVV/UCUUUCVkZQUUUCUCCCCCVbkkkkkdpppate&ree****akjkxjskkkkkjjjjkjssjppppjjpajxk8899iokBcihjiii8*t*#&&o%*&$$$$&&&&&&&&&&&&&&$$#O#$&&&*&&$OO#$**&&&&$$%@@$$$$$&&6.-:44::::::::::::::::3,<--;<,222>;;..>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>",
+":::::,,3::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<X..X5377;Xphxx5  8kxkht**&==*qispjkkkkkkkkkjuupkkkkjppppaut*$O --;,2544442>:<,<---:44444444::<<44,.Orrrt96<---.:::::---::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>::::::>>>>>::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::f7,,;;7fg1----gFQCnUCCCUQQQQQQQQQQQQQQAAQQQQQ~QQQUAACCCCCCQQQQQQ~QQQQQQQQQQQQQQQAAAAQQQQQQQQQ~~QUU~^^^^^~/~~~Q^/^^^~^^^^^^^^^^^^/~Q^~TTV^![TJEhxBppUnbUUUUQQAAAA~~QQQAAQQAQQQQQQQQQQQQ~!T}g.-444 jUnCVVCVCUCVbbVVbkbPVnVCVnVPPCVPPPUUUPP!TUPUVVPQVjkkVVkZUUCUQUUCUCVVbkkkkkkpddjddtrrtte#u&%88i8spjkknVnkkkkkkkkVkpapjjjkkiyi9+88hxkkkjiuu*&t*#&& #e*$$#$$$$$$$&&&***&&$$#OO#$$$*&$OOO&*ttt*&$&&@@@OOOO@*96.-:44::::::::::::::::3,<--;<,>22>;;..>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>",
+"::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<;768xPCs=-,;.ychy&8%o8*=upapkkkkkbkCVjjijkkkjdskdppp961-4::::::::::::::::::::::::::::::::44-<9yyer$* X744,-,--,-1;>>,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>:::>>>>>>>>:::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::17-gf447X+ jbU^UVCQQQQQQQQQ~~QQQQQAQAAAQAQQQ~~~~QQQCCCCAQCUQQQQ~QQQQAAQQQAAAAAAAAAAAAQQUQ~~~~^QUCVVU^^^/^^^~QQ~^^^^^~~^^^^^^^^^^~Q~^~^UV^^^~PnPqDD79kVVbVPUUUU~~~~QQQQCQQQQQQAAAQQQQQQQ~!]BX...,-fFWJPCAAACVUPJBnkVVVUCkkkkzBHJJJJU!UPUUUUPJPJnBCkkkkbVUUCCUUUUUZVVVVkkjkkkkspssdddauuuuer&&&$$$%88yhNJKhzIHBcxlJNlchcxBNi&*&$&et&@ikhitt*&&&%%&#$&***&$$$$$&&&&&&&$$$$#&$#$&*&$&&$$$$&****&&%++##$%Oo&yy96<:444>>>>>:::>>33,>,,::::::::>>>>>>>>::::::::::::::::>>>>>>>:>>>>>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>;X9xITCka7XX.X9ch8%#=***uipjkkbkkkkVbkkapkkkkkjjsdpp6.,-:::::::::::::::::::::::::::::::::44-<6ytee=w%X;54-.<<<,--;>>,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>:::>>>>>>>>:::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::..-744371Xk^~UQUVCCQQQQQQQ~~~QQQQQQQAAAQQQQ~~~~UQQQACAQQQQQQ~/QQQQQQQQQQQAAACCAAAACCAQQUUUUQ~^UVnbbCU^^/^^^~QQ~^^^^^~~~~^^^^~~~^^~^^~~UVU^/UUCVk33;X9kVnbnnPQQ~~QQQQQCCUUQQQQQAAQQQQQQ~~^[Tc+.9X:-769kCQCCZZUPVJkznkkUQQUPPVBBHJBVPTUPCCCCCPPVnnZjkVZCUUUUCCUUUUZVVVVkkjjkkkkkkkjjdpauadutette&&&88*thkkihxcchhihhi8ycxk*tut&*ee*8&tit*tt*&*&%&*t**&&&**&&&&&&&*&&$$$$$$$#O$&*&&&$$$$$$&&&&&%@@+OO#%%&9y66--:444>>>>>:::>,3,>>>,::::::::>>>>>>>>::::::::::::::::>>>>>>>:>>>>>>>:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>;.6hBIInjg9..16hxh*$$#=88upjjkkkkbVCkjjkCkkkkbkkkpph+X<::::::::::::::::::::::::::::::::::4,<<69tt=$*8X.3fff7<--<-;>>,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>::>>>>>>>>:::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::<X74547;X+UQQQQQCCCCCQQQQQQQQQQQQAAAAAAAQQQ~~~~UQQQQQQQQQQQQ~QQUQQQQQQQQQQQQAAQQAACAAQ~~~~~~/^UVkkbVP~^^^^^^~~~^^^^^~~~~^^^^~~~~^^^^~^^UZU/QUCbCf-1XXiJPVnbP^^^~QQQQQCCCCQQQQQAAQQQQ~~~^/^^]NXX63-;XX8xPUPVCVVJPVJCnVUUU~!TUVBBBCCVVCPCCUCVVVnVPZkVZUUUAUUCCCCCCVVkVkkjppsjkkVkkjdddpaadpaaddatr***&&ttt&*8*utt&%88o&ipt&&&&eaa$$&$tt*ti&&&*&&&ttt8&&&*t******re&&$$$$$$$##&***&&&$$$$&*$$#@OOO@$$$%&996...-::44>>>>>>::,33>>:>>::::::::>>>>>>>>::::::::::::::::>>>>>>>:,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>1XX9lnzkiy6;1;;hhu=#O#88iappjkkbZZVkkkjnkkjjbbkksjh9X<,4:::::::::::::::::::::::::::::::::,<-.+&t*$*8+.7fgg773.,-<>,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::7-3-33-XXk^PQ/CUCCVCCUUUQQQQUUUUCCCCAAQQQQQ~~~~UQQQQQQQQQQUQQUUCZCUACCAQAAAAQQAACAQQAQQ~Q~~~QQQUVbbVU~^^^^^^~~^^^^/^~~~~///^~~~~~~^^^//^UVUQUPVCx;11X1cJPVmCQQ~~QQCCUUCCUQQQQQQAQQQQQ~~~/^^[^H6X,;11XX09BnP!JYPx uBVkkVCCCCPVnnVVVVVUUCVVVVVVkVPUVZUUAUZAAZVVZZVVkkkkkkjkjjkkkkkkdpddaapdpddkdda*tuuuute**&&*e*$&&&&*88***tue*tttt$*tttt&&&&&&*t*tte*&**&&***eee**&$$$&&$$$&*e*&*&$$$$&*###OOOO@$&$%&9+X..;<::::>>>>>>>>,333>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>:,,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>,;.XX%icpi97551X%ue$$$%98*upjkbZUCbjkkppzksakkkkkjh9.-:3::::::::::::::::::::::::::::::::;<<-..+8t&&y6X-7777gf<<-<,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::33:-3,X9kP^~^^VCUUCCUUQQQQQQQUUUCCCCAQQQQQQ~~~~~QQQQQQQAQQCCCCCCbVCCCZCCCCCCQQACQQAAAAQQUQQQ~~~~UZVU~^^^^^^^^^^^^//~QQ~////~~~~~~^^^^^^^/PVPUQCbx0X11;1xJVkbCCCUQCVZPUQUQQQQQQQAQQQQQQQ~/~^!!{N+11-;71;;;6vchh8   kJznVbkkbVVnnVbVVVPUJVVVVVVkVCUZZAZAQAZZZVVVVbVkkkkkkkVkkkkkkkkdddddaapddkkjdjuadpppdaddduee*$t*&tt*8ut*upu&*tt*O&ttt**&&&****&*tte&&&&&&&*ree**&$$&&&$$$&**&&&%#OO$$$$$$$OOO#O#$%%6+.;<,<--::>>>>>>>>>3333>::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>:,,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::><111XXX9pkh723310au$*&o9=%*pjjkVCCVkkkkkVbsajbkkkhcy.-:4::::::::::::::::::::::::::::::::;<<<..+%9%&y9X.<..<ff,--<,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>:::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::4342;.9J^^~/QQUCQQQQQQQQ~//~QQUUUCCCQQQQQQQQ~~~~QQQQQQQCCUZCZVUUCCVVVVVZZZCCQQQCQAZCQQQ~~QQ~~/~QQPPQ/^^^^^^^^^^^//~QUUQ~~~/~~~~~~/^^/^~/^/CVUUCkxhX;37-gLPbkbbbnVbnCCUQQQQQQQQQUQQQQQQQQ~~/^^^xh6h7X>>:7-3XX.XX%6XxEHnHJJVVVVVVVVZVBBJJJJJJVVVZUQAVVVAUZZZZZZZVVNkkkkkkkkkkkkkjjkddddddaddjkkkkkjddddddddkddeueettte*ettte*ttuu*O&#&t*tu**&&***&*ttt*&&&&&&&&*ee*&&$$$$$#$$$&&&$&%%@O$$$$$$$##$$O$&&%+..;;<<---<::>>>>>>>,333>>:>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>:,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,--;11XX#kc172X19iuee&%&%%*appskbVVZPCVkVkaajkkkkhcgX-,:::::::::::::::::::::::::::::::::<;<<<-<6++9y6X7f737,<,-<<:::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>:::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::4433;Xx^~~~~QQQCUQQQQQQ~///~QQUUQQUUQUQQQQQQ~~~~QQQQQUACCUVCVVQQQUCZVVVVbVVCUQQQACZCQQ~/~QQQQQUAQUU~/^^^^^^^^^^^/~QQAAQQ~~/~~~~~~~~~/~~/~/~UCUUVVn9X544>xIVbVbbbkkbVVCUQUQQQQQQQQQQQQQQQQ/^Q]^B8x_H1,::444,;108h9.fzKYYEYYIPPIIIPPIIJHJJJKPPUUZZUQVbVZZZZZZZZZVVNkkkkkkkkkkjjdddddddjdddddjkkkkkkkkdddddddddeauuett**et*&tt*#*ap&tttt&*ttt******tt******&&&&**ee&&&$$$$$##$$$&&&&&%##$&&$$$$$$$$&$&89XX.---;<<--:::>>>>>:>,>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>:>>>>>>>:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,<-;1 hxh111;1+yhi&%O%&8uapsjakVZVbVbku*askkjkjxyX<3-::::::::::::::::::::::::::::::::,;-,3<<1699y<Xfcgff<-7<<<:::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>:::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::7-3,.XI/~~/Q~QUQQQQ~QQQQ^//~QQQQQQUQUUUQQQQ~~//~QQQQACCCCQZCZVQ^CUQQUCVVCCCUUQQQZCAUUAQ~~~~~QQQQUT~~^^^^^^^^^^^^~QQAAQQQ~~~~~~~~~~QQ~QU^/~~^CQ~CVVh1747:fHVbVVnbbjkVVCPPUUQQQQQQQQQQQQQUQ~^^^^^ek{LX-7447-71X9JV7;X.99fxHKIIE^_^^!^TJLYRYKHBJPUUA~ZVVZZZZZZUUZVVVkkkkkkkkkjpppdjdjkkddddjdjkkkkkkkkkjddddddduduu*&&*ttee&&*ttiit&t*ttttitttt**8t**&****eee****re**&&$$$$#$$$&&&*&&%@@$$&$$$$$$$$$@&y91.1-;;<,<-.:::>>>>>>>:--->3>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>:>>>>>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::>>>>>>>>>>>>>>>>33,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<<<9xHc81X1X;169t&$o%*8uasjjjkbbkspkju#ukpjjky6.<3-:::::::::::22222::::::::::::::::,,34::37ff96<.7gcl<7fgg7<,,:,:-:::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::44-.X9/^~~~QUUQQQ~^^^~QQQQQQ~QQUUUUUCCUUQQ~~~~~~QQQACCCCCUUCUQ^QUCQ~QUVVCCCCUCCQCCAUQQ~~~~~QACU~~~~~~^^^^^^^^^^^~QQAAQAAQ~~~~~~~QQQQQQ~~/^~^CUUZZUx97444-9VjbbnbbbnnCPCQUUQQQQQQQQQQQQQQUQ^^^^^Uz'I+X,-447-XyITVf<-<<.X.XXX19hzLxhyhv79h9.6+XhT!^CVVVZZZZZZUZVVZkjpkkkkkkkkdppdjdjkkddpddjkdjkkkkNkkkjdkdpdddaadee*$$$&&&**itit8*tuttuie*ettttt*8******ee&&*e*&&&$$&&$$$$$$$$$#@&&&&$$$$&$#O$$$$&y9++.1.977<-<;.>>>,33,>>>::>>33,,,>>>>>>>>>>>>>,::::::,::::::::>>>>>:::>>>>>>>>,>>::>>,>>>>>>>>>>>>>>>>>>>>>>>>:::::::::::,,:::::::::::::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::>>>>>>>>>>>>>>>>,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>:::::::<;lIHh%X.72-;9yt$%%%*uappjskbbbkjkkkwupuuhh9.;-3::::::::::::22222::::::::::::::::--:437fff97<..3gGl3,ff77----:,:3::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::4-7XXp/~/~QQQQQQQ~~^^~QQQQQ~~QUCCUUQUUQQQQ~~~~~~QQQACCCCCUQUQQ~UQU~~QQUUQUCCCZCQUUQQ~~~~~~QUUUQ~^~~~^^^^^^~~~^^~~QAAQQAAAQ~QQ~~~QQQ~~Q~~^~~~^UUVVZVl-4f4-9JkkkkVnbnVPUPUUUUQQ~QQQQQQQQQQUQ~~~/^~U^z +7-,<X.lT^Ukg,<7-<3-<<<;XX...XX..X-;;-.XX9lHCVkkVCZVZZZZZVVkkjjkkkkkkkkjpdjjddddpdpddjkjdjkkkkkkkkkkkdpddaadute&&eer$&&u*ut8ttut*tt$****tte******ttt&$$&&&&&&$$&*&&&&&&&&&$#%%%%$$$$O$&&$#%&yy6+XX16777<;,,;,>>,33>>>>::>>,3,,,>>>>>>>>>>>>>::::::::::::::::>>>>>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<::>>>>>:::::::51hNx8 6;24519er%+o%8aaassjkbbbkkkbp*uuuhi+X;-:2:::::::::::22222::::::::::::::::,,333337;...--7llGg<77-.773:,,--::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::4:1.iP/Q~QQQ~~~~~~~^^~QQQQQQQUCCCUQQQQQQQ~~~~~~~QQQQUUUAZUQQQUQUUQ~UUQQQ^~QUAZZUAUQ~~~~~~QUUQQ~^/^~^//~~~~UQ~^^~QQQQQQAZAQ~~Q~~~QQ~~~Q~^^/^Q^CUUVZVHg4443XlIJPnnnnCCCCCPQQQUQ~QUQQQQQQQQUQ~~~^/^^^k XX.669lT[^ZjxhXX,7----<,<--..;1,,335-,-.1X6cVVVZVVVZVZZVVVbjkjjkkjjjkkkjpjjjddddddjjkkkkjjkVkkkkzVzkkdpdddapaue**er&$&et*ttttttt*te#****ete&*******e*&&$$$$&&&$&*&&*&&&&&$$@&&&$$$$$**&%%&8y96XX.X99661;;,,,33>>>>>>>>>>>>,3>>>>>>>>>>>>>>>>::::::::::::::::>>>>>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+"2222222222222222>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<::>>>>>>>:::::2;19ixc9-273-X@&&+o%8uapsskkbbbbkkkp=wpiiy+X;-:4:::::::::::22222::::::::::::::::;;-:::,<;..67:7gglG7<77<-:--:,--::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,7Xh^/~QQQQQ~~Q~~~~~^^QQQQQUCCCCQQQQQQQQ~~~~~~~QQQQQQQQQCQQQQU~UPUQCCUQQ~~~QQUCCCAQ~~~~~QQAU~~^//^^//~UAQUUQ~~~~QQQQQQAZAQQQQ~~~~~~~~Q~/Q///QUCPZAVJSf4--1X9BIzBkkVVnVPUQQUUUQQUUQQQQQQQQQ~^~^^^^/UkpxJKBI^^~QUVcxvX1XX,<--,-:33;,,-->2-27>>7..gJBBVVkjkVZZVVVbkkkkkkssjjjjjsjjjpddjkkkkkjjkkkkkkkkkknkkkdppdppppaer*r&$$&tt**ttteeeett&tee*ee****8****ette*&$&r*&$&&&&*&&&$$$#O$&$$##$&t&%%9889;.X.66y961..-;>>3>::>>>>>>>>>>>,>>>>>>>>>>>>>>>>::::::::::::::::>>>>>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::,::::::,::::::::::::::::::::::::::::::::::::::::::::::::",
+"2222222222222222>>>>>>>>>>>>>>>>::::::,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>:::::2,;X hlh72543.X+&%+%%*uapjkkkkbbkkka=*ptyy+X;<3::::::::::::22222::::::::::::::::;-..--....197,4flgGg<<gc,7,--::3::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::-;9I'~QQQQQ^^~~~~~~~^~QQQQUCCCCQQQQQQQQQ~~~~~~QQQQQQQQQQQQQQ~Q~UCUCCUCUQQ~~~~QACAQQ~/~~~QUUQ~^^/^~~~QUCZCAQQ~QQ~~~~QQQQQAQUUQQ~~~~~~~QQ~/^~/CVUUAUUBx77:,,XXXlTxzkkVVCUUUQUUUQQUUUQQQQQQQQ~/^~^^~^/^^/]^^^^~QUQUxkzzhhg.1-<,---:3,>>,333>>:---<7hxNNNzkkVVZZVbbVkkkkkjkkjjjjsjjjpdddjjkkkppjkkkjjkkkkkkjjdppppddpaueeer$$&tt**uuttetettetttt****&**ettuauute**ete&&&*&&**&&&$$$#$$$$#O$&&&98y96X-,;119y6+...-->2>:--:>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::,::::::,::::::::::::::::::::::::::::::::::::::::::::::::",
+"2222222222222222>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>;;;>>>::::,-.1XX9lg7-:7,-;++%%%%8uaskkkkbbkjpp*=i888+X;,3::::::::::::22222::::::::::::::::11<<....XXX67<4fgflg<7gcggf3----::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::.XJ^~~QQQQ~^~~~~~QQQ~~QQQUCCAQQQQQQQQQQ~~~~~~~~Q~~~~QQQQQQQQ^UQUZCZUQCAQQ~~~~~UUQQQ~~~QQAUQ~^^^^^~~QUCAQCAQQQUUQ~~QQQQQ~QAAAQQ~~~~~~~UUU^U~~VsCQQUPVH9X1->7119KNkkkVVVCUQQQUUUQQUUQQQQ~~QQ~/^^^^^~^/^~~U~UQQQQUCUbkknJBhXX-,,:3,:--::-----:::23-X9cNBBVPVVVVVbbbkkkkkjkkjjjjjjjjjdppapjkkkpjkkjpjkkkkkkkdpddddauuueeeer$$$ttteppptttttteettt*&&****ttuuuttteeetter*ee**ee*&&&&&&&ree&&&&&8yy96.X>3,;.9y+++X.;>54:---:>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+"2222222222222222>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<>;;;;>>>:::-77;.69f76<;>>23X+%%%%=8upsjkbbbjpap8%uyy9..1<3>:::::::::::22222::::::::::::::::X.16699999&66<-4<7gf7ggfff7-,3:-::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::.6^^~/QQQQ~QUQ~~QQQQQQQQUQQQQQQQAAAAQQQQQQ~~~~~~~~~~~QQQQQQQ~UUZZCVUQUUQQ~~~~~QUQQQQQQAAAAU~^^^^^~~QUZAQAQQQQAAQ~QQQQQ~/QQQQQ~~~~~~~~UUUCU~QCbCUQUCVYxX67X27XXlHkbkCCbZUQQQQQUUUCUQQQQ~~QQ^^~^/^^^^/~~~~AQQQQQQUAAbskxxH91.;----3333,<--<<,,33446X+hxxkkBkbVVbkkkkkkkkkkjjjjjjjsjjppapppkkjjkkkkkkkkkkjjdpaaaauewteeeer$$$teuujkdiuutetteettt*&****ttttette**etee**eeeeee*&&&&&&rtuut*&&88991.;144><X6y&+ X.;>44>::>>>>:>>>>>>>::::>>>>>>>>>>>>>::::::::::::::::>>>>>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+"2222222222222222>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<;;;;;;>>:::-<.-<-X6X.1--234X +9&&**uapskbbbkjppq#tih9X.7-:2:::::::::::22222::::::::::::::::+69999998yy99f77<7<fgg7g-,<,ff7-::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::Xx[!/QQQQQQUUQ~~QQQQQQQQQQQQQQACZCCAAQQUUQQ~~~~~~~~~~QQQQ~~QQCUCCUZA~QQQQ~~~~~QUAAQQAAAAAAUQ^^^^^~~~UZZAQQQQQAQ~QQQQ~QQQQQQQ~~~~~~~~~U~~Q~VbVQQUCUQUV^x9-3fX1.+NnkjVUCUQUUQQQQQQCUQ~Q~~~!~^^~^/^^^^^~~~AQAAQQQQQAQACVnzBxv1;->3,:::---<<-,--34-7...+9hhjkkkkkkkjbbbbkkkksjjssjssppppppauuppppjkkkkjpsppdddaaaueruuuueer$$$teuujkduuutttutetuut*****tiateee*&&ee**&&eeeeee*&&&&&&readu*#O&++.....45:1X+y@O X.;544,,>,3,>->>>,,>>::::>>>>>>>>>>>>>:::,,:::::::::::>>>>>:::>>>>>>>>:>>,,>>:>>>>>>>>>>>>>>>>>>>>>>>>:::::::::::,,:::::::::::::::::::::::::::::::::::::::::::::::::::",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::-37,-,,---:>>:>>>>>>2222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<;.69%O$euuapkkxjaupa$*ai9+.-:44>>>,,,,,,;->33323,,;<;;;,:44::,3y999999669yyyeeertt+.7ff7444ff1.,----<,-<<<<<<<<:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::-3,-,--qQQ~QQQQQUUUQQQAQQ~~QQQQQQQQAAAACCCCCCCQQQQQ~~~~~~~~~~QQ~~~~~QUUQQUQQ~QQQ~~~~~~QQQUCQQUUQ~QQ~Q~~^^UUUCVAQQQQAQQQQQQQQ~QQQQQQ~~~/~/^~UU~~~ZVCUQQCIT!UZZTP8X75;X7zVbkC^~QQ~QUQ^~PCUQQQQ~~~~~^/^^~~~~~~~~QQQACUUQQ~^QUQQQUQP!0X7-74::::::::::::::::35-9hlkjkkkkkkkjkkkkkkkjssjkkkjspdaaapautajjkkkkkzaapudaudddduteyyhhht&&$*t**pkkdeaueuuaeuuteee&yyy88yihttte*&$$rr$&eeerrrr$$$$ryyhg7<->>>>>:;;;;<:::,37...;;>44:::::::::::::::::::::::::::::::::>>,,>>:>>>>>>>>>>>>>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::,77,-:,::-:>>>>>>>>>>222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<;69%O$$*euajkxja*au$*ai8+.-444>>>,,,,,,,>>,2>>--......,>:::::,6++69ggg96++9ttrree%.;,4745:3<..,<7f,--3<<<<<<<<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,-,,---7U^QQAQQQQQQUQQ~/~~~~~QQQQQQQQQACACCCCZCAQQQ~~~~~~~~~~~Q~Q~~~~~~~~QQQQ~~QQ~~~~~~~QQACUQUQQQUQQAUUUPCCCVCCQQQAAQAAQQQQQQQCQQQQ~~~~~~~~~~~~UUUQQQQQIIUVVVZBz61-;;fWVnkC~QUUCQQUQ^~UQQQQQ~~~Q~~^^^~~~~~~~~QQACCUQQQQUQ~QQQQQ^BXX7:44::::::::::::::::43,;9hkkkkjjkkkkkkkkkkkjjjjjkkjsuaaaaaai*ajkkkkkjpukkeuadddpiyyyhhhhiyt*&*e**pkkkuuueutteuit*ee*yyt888yihit&&*r*&&retttteeeeeety99961-->>>>>:;;;;;:::>,1...;;>44::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::::::::::::::::::::,,--,77,,,;:--->>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,;.6%#$$=**upjjjpuu*#=et86.-,4422222223>>3,>---...+++667,:::--<....67fg91XX+999eet96.X.--,3--;<-,gDc7--::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3-:,,--g{~UQQ~QQQQQQ~~QQUQQ~QQQQQQQQQQACACAAACAQQQ~~~~~~~~~QQQQQQ~~~~~~/~QQQQ~~QQ~~~~~~~~QACUQQQ~QUQQCZCPVVVbVCCQQQAAAAAQQQ~~QUAQQQ~~~~~~~~~~~~QCU~QQQQQPPUVZVVzHvX53;1FPVnU^UVCVU~UCU^UQQQQ~~~~Q~~~~~^~~~~~~~QQACAQQQQQ/QUUQQ!!TqX.>444::::::::::::::::>3,.X9hkjkjpjkkjjjjjjjjjjjssssppaappaaapapkkkkkkssadaeppuippiy9+96+++98&&*e*ejkkkueeeteeeuiteeeettt88ttiputttte&&**999tytuut*&&96+...-->>>>>:;;;-;>>>2,,;;;;;>44::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::-::--,77,77,<-;:>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>,;.+%$$*****uiijpuu*#$#*89+.<::::444444423,--<<6999999971--<--...<<<<<<<<....66999yy9++XX.6.;7f3-7gf2-::4444444::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,:3-:c]!Q~~/QQ~QUQ~QAVAUQQQQQQQQQQQQACAAAQQQQ~QQ~~~~~~~~~QQQQQQ~~~~~~~~QQQQ~~QQ~~~~~~~~QQAUUQQ~QUQQUZVPVVVbbCZUQQAQQAQQ~~~~QQQQQQ~~~~~~~~~~~~UUUQQQQQCVCCVUPVnLl;5;-.D!PbPQCVVVCQQCCQQQQQQ~~~~~~~~~~^^~~~~~~QQAAUQQQQ~/~Q~UU!ThX11-344::::::::::::::::3-;1.X6hckjjjkkpjppsjjjsjspppppappppppppkkkkjjjjdjjdaapt%&8996.XXXXXX6yi***eakVkkaeeetttetttettteetttttuttttuue&996+.++9iit&+XXX..X.;<::>>>>:;;;-->2444>;;;;:>44::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::::::::::::::::::::,,:-:,,,777<<,,<<>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>3-.+%%&$&*=*euuupaau*=##&96..<:::444444442:-<66&&&&&&&661--<-..--,,,:::-:,<...16699tytt&  XX-ff7-----2322444444::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::-,,-,,-gP^^~/QQ~~QUUCAAA~~~~~QQQQQAAQQQQQQQQQQQQ~~~~~~~~~~~~QQQQ~~~~~~~~~QQQQQQQQ~~~~~~~Q~QQQQQQ~QQQ~QZVVVVnnbVCQ~QAQQAQQQQ~QQQQQQQ~~~~~~~~~~~QQ~QQ~QQQQUPCVUUCJHS11-:XgYIxkVZVbVVU~UUQQQQQ~~~~Q~~~~~~^^~~~~~~QQUQQQQQQ~Q~~~^[!lXX;,::4:::::::::::::::::3--71XX6hhhhkkkjjjjjkjspsppppppappppppppkkjjjjkkdddkjph8++11;;;>;..1..9hy8**akNkkduuuttueteetttttttteeeete&&rtuu971..X.+hy9+X;>5X.;<,,>2>>>>:;;;-->24444>:;;:>44::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::-17,<,<-;<<<<>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,-.6%%&$&&=*****uuaauu*$&89+..<::44444444:-<169&&$$$$@++<-<<-..::,2444334::<<<-;766&tter$@+<<24--<,;,,->>>24444----------------::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::-,3-:,-3iP^Q/QQ~~QCCUQ~~~~~~~~QQQUUUQ~~~~~~~~~~~~~~~~~~~QQQQQQQU~~Q~~~~~~QQQQQQQQ~~~~~~~Q~~QQQQ~~~QUQQZVnbbbnbVCQ~QQQAAQQQQQQ~QQQQ~~~~~~~~~~~QQQ~~~/QUQ~~UQUQQPJzS1-,3X-hKJkknVVCUQQQQQQQQQ~~~~Q~~~~~~^^~~~~~~QQQQQQ~~~^/~Q^TIH9X1->3->3::::::::::::::::-,:--,<.1699ihjjjjjkkksppppppppppppppssppppjkjjjddddjkc9X.;;-:>2;;;1.X.9hy8*ukNkkjuuu*etee*etiutreeeeeeee*$$&ttu3>>,1;.+yy6..234-;<;-:234>>>:;;;-->444444>:;:>>4::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::---::,,3.--;171-;;;<<<<<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::4>-<66+&&&&$$$$$&**euuau*&&96..<::44444444:-.++&$$$$$$@+..-<:--<33::444434:::<<-<166&&&$$&&97<-41...X;1.;;;>>>>>---------------:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,-,--,-- k^Q~~QQQAZCQ//~~~~~~~~~QQQ~~~~/~~//~///~~~QQQQQQQQQQQUAQQQQQ~~~QQQQQQQUQ~~~~~~~~~QQ~~~~~Q~Q~~UUCbbCbbZAQQQQQQQQQQQQQQQQ~~~~~~~~~~~~~QQQ~~~~QUQQQU~QQUVBJH1X-,33 hzBBkbVCQQQQQQUQQQQ~~~~~~^~~~~~~~~~~QQQQQQ~~^^^/~^/x+99,:-22-2,::::::::::::::::-,:--33-XXX.+9ihkjjjjjjspppppapppsjjspsjjsppppaaedkjkl9..;>3225:>>,,;.16yyy*tdkkddeeu&**ee*etttt&&&*reee*&&*tt&@25>31;169y96;244<<<:::224>>>:;;;-;>444444>:::>>>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::3,:::::,<;-,9g7;;;;;<<<<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::4:-196+*&&$$$$$$**$&*eauu*&89+X.-::4444444-<++@@$$OO$$@+X.-::--,:::4344:::3,:-----166   @&6.<->fy6.+699+....;;;;-------------:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,-,,-,,39j^QQQAAQACCUQ~////~~~~~~~~~~~~~^^~~~~~~/~QQQQQQ~QQQQQUAQQQQQQQQQQQQQQAAAQ~/~~~/~~UQ//~~~Q~~~^Q/QVCUbbCCQQ~~QQ~~QQQQQQQ~~~~~~~~~~QQQ~~QQ~~~~QQQUQU/QUUVVzN61,-::XXXxIkkVZUUUQQUQQQQQQ~~~~~^~~~~~~~~~~QQQQQ~^^^^/~^^^cX;.--33-37-::::::::::::::::<-::44223,1.XX8ckksssjjjpppaaaaasjkjpappkjppauuuppphh9X132255:23225-:,;X69yt*pkkpdetaeeeeeeettttr***r***e&&*89+X32>>.X.9&yy6<>44:>>222554>>>:;;;-;>444434>:;;:>>::::::::::::::::::::::::::::::::,>>::>>,>>>>>>>>,,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::,,,:::::::::::::,,,:::::,<;17771;;;;<<<<:::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::,,33::::::::::::::::::::::::::::::::::::::::::::::::::::::::4::<1699%$$$$$$$%$#$*eteetay&++X---:44444:..+@&&$$$O$@9+.-:4442:::::::::2:::----......XXX....;<,9yyyyyyy6+X..X.1<-------<::-------::----::::::::,,,:::::,,,:::::,,,:::::3,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::-:,:--,,::::::::::::::::+B^QQCZZQQUAUQQQ~~/~~~~~~~~~~~~~~^^^^^~~/~~QQQQAQQUAAQQQQQQQQQQQQQQQQAAQQ~/~~~/^~~~~~~~~~~~~~QQ~~QQUCVZUQQQQQQQAAAQAQQ~~~~~~~~~~~~QQ~QUQQ~~~QUQQQQUUUUCVnH9.;<-4.X6XzIkVVVAUCUQQUQQQ~~~~~~~^^^~~~~QQQQQUU~/^^^^[^^T]yX,::444:>;;::::::::::::::::<<::44445>;;.X9hkssjksssjspauaauapjjauuaspkkuuawci9+XX;32222>:::44422::;X+9te*udauuuat&eettettttettte**t*%&89+XX:,--19y99t96;>24>>>>>444>>>>:;;;<,>444443,;;;:>>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>,,>:>>>>>>>>>>>:::>>:>>>>>>:>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:-",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::,,,:::::::::::::,,,:::::<;-<771<;;;<<<<<:::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::,33::::::::::::::::::::::::::::::::::::::::::::::::::::::::4:--;166&&&&&$$$O@$&&=$#*tut%%+ ..<<:::::<66+@@$O$$O$&6+->44444:---::::::::-----1<;.;;,,,,;-...Xo&t8*&&&8%++.XX.<<<<<<,,<<:::-----::----::::::::,,,:::::,,,:::::,,,:::::,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,<-:,::::::::::::::::Xc^^QAAAQQQQQQQQ~~~~~~~~~~~~~~^^^^^^^^^~~~QQQQQQQQQAAQQQ~~~~~~~~QQQQQACAVAQ~~~~~~~~~^^^^^^^^~~~^/QQQQACCQQQQQQQAAQAAQQ~~~~~~~~~~~~QQ~QAUQQQQQQQQQQQUUPCVBJ8X6<,4<<6X9KBkVVVZCCUQQQQQQ~~~~~~~~~~~QQQQUUUUQ~~~^/^^^]^Rh;-:4444:>;;::::::::::::::::<<::444442>;.X6hssjjkjsssppauapaasjkpuuakjkkpaaih91X;1>-222:::<<44444::<.69yteudauuetu*eett**tttttttt***&%989.XX,1<.69y&*&@ .;>4>>>>>>>>>>>>:;;;<>>2442:<-.--->2::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>,,>:>>>>>>>>>>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:-",
+">>>>>>>>,,,,,,,,>>>>>>>>>>>>>>>>::::::::,,,:::::::::::::,,,:::::;;;<,,;-;<<<<>>>:::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::--...66&&&&&&%&&$#$$$*uu*@&*o+....-;<1699&@@@$O$$@y+1->44444:;;;;;;;;;;;;;;;;..;<<>4444>,1666o9ttyt&&*98y96XX..-<----<<,:::::----:---::::::::,,::::::,,::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,,:<<<::::::::::::::::X9I^QAQQQQ~~~QQQQQQ~~~~~~~~~~~~~^^^^^^~~~~QQQQQQQQQQAUQQ~~~~~~~~QQQQQACZZVZU~^^~^^^^^^^^^///^^^^/~QUUQQQQQQQAAACAAAAQ~~~~~~~QQQ~~~QQQQAQQQQQQQQQQQQUUCCCVPz9XXf---<.6JIzbCCCCCU~QQQQQ~~~~~~QQQQ~UUQUQUUU~//^^^^^)Jcy6---444::>>;::::::::::::::::<<:::44452>;;.6gsjjjjjjssppaapjppsjjpaapppjjuupp91X-,72-22:::<<-224444::-1698tuduua**ueettt**ttuttt8**&&**8y96XX;;..69y9t&OXX;,:>>>>>>>>>>>:::;;:>2222>;;...-->2::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>,,>:>>>>>>>>>>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::,,,:::::::::::::22222:::;<,,<;;;<<>>>>>>:::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::,::::::::::::::::::::::::::::::::::::::::::::::::::::::::22::-;...++6&&&9&&&##$**tuae#&*&96+XX.669999&$$$$O&&&y.1;>4444::;;;;;;;;--;;;<<<..67774444437999+9yyiy&&@%9y99.X<79977<<<<,:::::::--::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::-<,,:<<-::::::::::::::::XXB^QAQAQQQQQUAUAUQ~~~~~~~////~~^^^^~~~~~~~QQQQQQQQQAAQQQQ~~~~QQQQQQQACZUZVC~^^^^^^^^^^^^^^^^^^^^^~Q~~QUQQQQQAQAAAAQQ~//~~~QQQQQQQ~~QQQQQQQQQQQQQQQQUUUUPVUByX1-3-,;18zzkCUCVCUQQQQQ~~~~~QQQQQQQQQQQQQQ~Q^^^^^^[)9XXX;7:444::><;::::::::::::::::<:::::22:2>;;.19jsssjjjjspppaskkjjjjpapjpjkjhkkh>>>>>222:::<<<<<:::4444:-.1+&*udauae*tttttteettt8ttteettt88y96.X....69999+ X.<,>>>>>>>>>>>>>>>>>2>>2><166666;->2::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>,,>:>>>>>>>>>>:::>>>>>>,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::,,,:::::::::::::22222:::;<,,<;<,>>>>>>>>:::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,33,,<;;...++699@%%&&*&$uuau$O&*yt&&%&999&&&&&$O&O&*&yX1;2444::-;;;;;;;;;;;<>>,,.67fff7344:>7776166699+++XX...;<67ff77,<<<,:::::,:--:,::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::----<:<<::::::::::::::::.XB^QQQAQQQQQAUQQQ~~~~~~Q~~~///~^^^^~~~~~~~~~QQQQQQQQQQQQQQQQQQQQQQQUCCCCCU~^^^^^^^^^^^^^^^^^^~~^~~Q~/~QQQQQQQQQQQQQQ~~~~~~QQQQQQQ~~QQQQQQQACAQQAQQQQUUUCVVJJcX7442,.XhJjkbVbVUUQQQQQ~QQQQQQQQ~~~~~~~~~~/^^^[^TExX111<3::::::::::::::::::::::::::::>>>>>->;;,;<7jppkkssjspppaskkkjjjpppjpu8yhh9X5>33:::3:<<:::::::::444::-.X+tappuaaettutt*etttetttttuadt**899+X;<<;;<66..XX.-:2::::::::>>>>>>>>32>>;;699996.-:4::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>,,>:>>>>>>>>:::::>>>>>>,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>::::::::>>>>>>>>>>>>>>>>::::::::,,,:::::::::::::22222:::-;<<::>>>>>>>>>>:::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<;;....66%@@@&*&#e*uu&OO&*8tt8*&&&&&&*&$O&O&&&y..;>444:-->>::::::>>>>2222;16777,,,:--;;--<-..66.X..XX.-<,;<<<;.--<<::::::,:--:,,:::::::::::::::,,::::::,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::----::<--------::::::::.XBUQQAAAAAQQCCQQQ~~~~~/~QQQ~~^///^~~~~~QQQQQQQQQQQQQQQQQQQQQQQQQQUCCCCCVCU~^^^^^^^^^^^^^^^^^^~~~^^~UQ~QQQQQQQAQAQQQQ~~~~~~QQQQQ~Q~~QQQQAQQACAQQAQQQQQUCVVVVBY9;43-3;.9kVkskbbUQQQQQQQQQQQQQQ~~~~~~^~~~~~~^^Tz89,;7X3>X>>>>:::::::::::::::::::::>>><<;;;;;;;,>>7aapkkksjsssspskkkkkkjpppa8thh9XX44::::<-<<<:::44-<<::4442<.X+taddupdtetuteettttettuuuuddute8t89+--,33---...;;->3;;;;;;;;,,>>>>>>32>>;.6y%&&+.->4::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>,,>:>>>>>>>>::::>>>,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::,,,:::::::::::::22222:::>>::::>>>>>>>222:::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<;....%+@o@&&&$$eu&###$$$&&$$$$$$$$$$$$O&%&++.;>22:<-.>>>>>>>>22222222<;-.......---<>>22--3,.;-;<,3344.;...-<<----::::,:--:,,::::::::::::::,,,:::::,,,,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3,---::<--------::::::::X+JUCAAAAZCAACCUQQUQQQ~~~QUUUQ~~^^~~~~QQQQQQQQQQQQQQQQQQQQQQQQQQQUCCVCCUUUQQ^//^[[^^^^^^^^^^^^~~///^^~~~~~~~QAZCCAQQQ~~~~~QQQQQQ~Q~~QQQCAQQQAQQQAAQQQQUCVVCbjIHX445>;1X nVkkVbPQQQQQQQQQQQAUQ~~Q!!~~~~~~^~^^JqXX:3>X>3>7>>>>::::::::::::::::::::>>>>;;;;;<--,>;3uapskkkjsssjsjkbkkkkjppp8yiy9XX64::-<<-.-<<:4444--<::444:-.X+tppdajdeetteetttttttteeuadduuuttyy9,-:33442>-;,,>43;;;;;;;;<,,>>>22442,..+t@&&+.->4::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>,,>:>>>>>>>>::::>>>,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::>>,",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::,,,:::::::::::::22222:::3,>>>>>:>>>>2222:::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<;... o@@%&$$#$*t*&$O$$OOO#$$$$#OOO$&$#$@*o+.<,:::-..>>>>>>>>32222444711<;......;-:2344453--,----:444....;<------::::3:--:,,::::::::::::::,,,:::::,,,,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::73,--:<---------::::::::X9IUCAZAAZZCCCCUUCZCUQQUQUAAUQQQ~~QQQQQQ~QQQQQQQQAAAQQQQQQQQQQQQQUCCVCCUUQ/^^^^/[[^^^^^^^^^^^^~~Uk$*kU~~~~~~QACCAQQQ~~~~~QQQQQQ~~Q~~QAACCAQQQQQAZCCUQQUZCZVVnBL944f211%%8PnkVnVUQQQQQQQQQQAUQQQQTQ!~~~~~UVjjh0X%4-37>-5-;;;>::::::::::::::::::::>>>;;;;;;<--,>->*apaskbkjsjkkkbbVkkjppppia9XX..X::3,<--<-<<:4444.-<<:444::;.+yppdpkd&eue&*tttttaueeeaddduaauttt8f75444442-->>:44;;;;;;;;<,,>>>22442,.X@e$re@X-24::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>,,>:>>>>>>>>::::>>>,:>>>>>>:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::>>,",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;16999%+%tt&O$&&$$&&&&$OOOo%&&&&96733>:>,<-.;..<344432,<<<---::::::::--------:::::::::::::444::::::::,,,:::::,<---::-:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::377<-;;-:::::::,::<<,<- kVVCCCCAUCCCZZCVVZZZZCCACZCUQQQQQQQUUQQQQQQQQQQUCCUQUQQQQQQQQUAQCQAZZQQ~~~~~^//^/^^^^^^^^^^^^^^JkkVZ~~~~QQQQQQUAAAQ~/~QQQQQQ~~~~~~QQQQQAAQQAUUCUCCCCCUUUCVVZkCa.<.:4-fh+kPkVVnVUUUQ~~QQUAUQQQQ~QQQQTKlh7,:--5>>:::::::::::::::::::::::::::::::::::::::::::22222$puuppjjjkbbbbbVVkkpkpiiy9+..:24::::::::::::::::<:::4442>;.69icxllh++hyi&$eeretttttuaaaueeddduery9+X.1;->2222,,,>>>>>>>>>>>>>>>>44-.X @&$e96.-24;;<:>:::2>>>>><<::::::::::::::::>>>>>>>>>>>>>>>>>>>>,,>:::>>>>,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;...1+96+&8t&%*e*&&**&&&&@OO#&&&&++1;;--;;;.....-,2443,,,,<:--::::::::--------::::::::::::::::::::::::,,,:::::7,<<<:--::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::-----;77:::::::::,,<---< kVnVCCVCCCZCZVVVVbbVZZVZZZCUQQAUCAACAQQUACCCCAACVVZCCCCQAQQQUAACCQQCAQQ~~~///^^T^/^^/^^^^^^^^^^{^////~~QQQQQQQQAQQ~~~QQQQQQQQ~~~~~QQQQQAAQQAAUCCCUCCCPUUUVbbbUsX.,,32>1XiCkkVUPUTQQQQQQAAAUUUQ~~QUQV8XX<<:::422:::::::::::::::::::::::::::::::::::::::::::22222OaaajjjkjbbbVVbVjskjkiy9&+.X.:24::::::::::::::::<:::44423>16yhkxhy9XX9yye*eeettt8ttuaaauuuddauer&&%+.X;,>2222>>,>>>>>>>>>>>>>>>>44:;+%&t&&@+.-24;;<:>:::22>>>><<::::::::::::::::>>>>>>>>>>>>>>>>>>>>,,>:::>>>>,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>;;;;..6+++++++.++ o++%%&&$OOO$&$@@++.111666..+...<2442,,,,,,::::::::::--------<<::::::::::::::::::::::,,,:::::7,,<<:--::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3,---,77::::::::-:,,<-<, VCbbVZZCCCZZVbbVbkkbVVVZVVVZCCACCAAUUCZZZCCACCZCVVVVCCCACCAACCACCQQQQQQ~~~~//^~~~^^^^^^^^^^///^^^//^~~~~~QACCUQAQ~~QQQAAQQQQQQ~~~~QQQQQAAQQCCCCCCCCVVCCUUZVbkVV+9g<-7-1XiJkkVUPQQQQ~~QQZCCCCCPUQQUTjXX6--::222>:::::::::::::::::::::::::::::::::::::::::::22222 tpajkjkkbmkbbkjaskkji9+XXX.->44::::::::::::::::<::::4422;;69yhi91X.X+yytreteettttappppdpadpuee*&&996.;32222>>>>>>>>>>>>>>>>>>>>44,;+9ter@ X.<24;<;:>>::222>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>,,>:::>>>>,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222>,,;;.............+++@%&$#O$$$$@@@%%966696++%+.<<32::::<<,,:2::::::::::::::::<<<<<<<<<<<<<<<<::::::::,,,:::::<<---::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::--;<<;-:::::::::--,,,--*ZCbbVVZVZZZZVbbkkkkkbVZVVVVVVCCZCCCUUZVVZCAACZZZZZZCQQQQCCCAZZZAAUAAQQQQ~~~~~~~~~~//^//^^^^^//^^^^~~~~QAAZZZCUQUQQQQQQQAQACQQAQ~~QQQQQAAAQQCCCZVCVbbVCZVZVZVkkZ9yh1-7-1XhJkkbVVAQQQQ~QQAUUUPPPUVUTPhX1--::4232>:::::::::::::::::::::::::::::::::::::::::::22222 %iupjskbbbkbbsssknk896...-<:>44::::::::::::::::<<:::4422>;;6+++1.X1X+hyt&reeettuappppddpdpptee&t&@996;->222>>>:>>>>>>>>>>>>>>>>43,.+9ytt@ X.;>3;;;:>>>>222>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>,,>:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::5>2>>>>-;;;;;;;.33,;;..++@@$$$$$$$$$&&&&&&&&&%%&966773:::-<<<::2::::::::::::::::<<<<<<<<<<<<<<--::::::::,,,:::::<<<<--::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::--,777,-::::::::,:----<7VPVkVVbkkbVVZVVbkkkkkbVVkbVVVVVVZZbbVCZZVVVVVZZZZCCCCQQQQCCAACZVCCZZZAAAQQQQQQQQ~~~/^^^~^^~~~~~~//~Q~~~QAZZZZZCUAUUUQQQQQQVbCAAQQQQQQQAAACAACVbbnnbkkbVVkVkkkVskkh9.X--.XhBjajkkbAQQQQQQUUUUPPPJJxh9XX7;::::>>>>:::::::::::::::::::::::::::::::::::::::::::22222X+88ijpjbbkkbbkjkknh0X;-;,,,:544::::::::::::::::<<:::44233,;.XXX--.1X1g*t$rteettaapaauuaapdptre*t&@&991->222>>:->>>>>>>>>>>>>>>>52>.6yyiy@ ..-:3;;;:>>>422222>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>,,>:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::,,,,::::::::::::::::::::::::::::::::::::22222:::::::::::::::::::,,,,,,,,::::::::::::::::::::::::::::::::::::::::44442>::>>-;,,;;445:--..6+@$$$$$&&&$$$$$&&&&&$$$999973,3:-<<<:::::::::::::::::::::::<<<<<<<<----::::::::,,,:::::,,,,<--:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,7773,::::::::-,,<--7gVZkkVkkkkkkVVVkkkjdjkbkkkkbbbbbVVVbkVVVVVVVVVVVVZZCCCQQAAAAQQQZVbVVVZAQQQQUAAUUQQ/~Q~//^~~~~~~~QUQUUUUQQAZZZZVVVCAUAAUUAQAZVCQAQQQQAQQACACCCVbbbkkbkjkkjkkjkkkpkkkkh9..11+xkwsbbbVZAQQACUUUUPBxh9XX..7,-::2:::>,:::::::::::::::::::::::::::::::::::::::::::22222..69ypsjkbmkbbkjjkkhXX>5:::::442::::::::::::::::<<::::2223,;.X.1-:,<X199t&euteuuaaauuuuuuaddtete&&&&%61;>>>>>>>>>>>>>>>>>>>>>>>>42>..9yyy% ..--2--;:>>22222222>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>,,>:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::333,,:::::::::::::::::::::::::::::::::::22222:::::::::::::::::::,,,,,,,,::::::::::::::::::::::::::::::::::::::::22222222>>>>>>>>44433,<1+++%%$$$&&&$$$$$rrrr&$$$&9997,::,<<<<::2::::::::::::::::>>>>>><<<;;;;;;;::::::::,,,:::::,,,,<--:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::--------::::::::--,,--fhkNkkkdkkkkkkkkdddpddkkkjkkkkkkbVVVbkVVbVVVVZZVVVZZCCCAQAAAAAQQAVmVZZAQQQQQACZZCUUQQQ/~Q/~QUUQQUAU~UUQAZZVVVVVVVVZCCCCCCCCCCQQQUCUUACAAACCCCCbmmbkjkksppapppkjapkakIPzhXX1XlBupbbVbmVAUCVVVnkh9XXXXX;;-,3:::>:-;>:::::::::::::::::::::::::::::::::::::::::::22222-;198ajskVVVVbbksjkl1;34444::222::::::::::::::::<<::::22:>>-;;113:3:-16yt*tdu*uiuuuuwwuueeutett&$&e&+661;>>>>>>>>>>>>>>>>>>>>>>>42,;..+&y9+.1,,:---:>>222422222>::::::::::::::::>>>>>>>>>>>>>>>>>>>>,,>:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::333,,:::::::::::::::::::::::::::::::::::22222:::::::::::::::::::,,,,,,,,::::::::::::::::::::::::::::::::::::::::22>>>>22>2332>2344442--.X.69%%%&&&%$$$&rrrrr&$$$@&997<--,,<<<::,::::::::::::::::>>>>>>>>>>><<<<<::::::::,,,:::::--<<<-:,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,<<<,,::::::::,--<<--7kkkkkjkkjjdpddpdeuapddjjjjkkkkkVVVkkVVVCVVVVVVVVZZZZZAQACAAAQQCVkZUUQQQQQQACZVZCAACQ^bwjUUUUUUCZUQZZZZVbVVVVVkkVVZZVVVCUCCQQQQUCCCCCCACCCZZVbjkkjpppaaaaeauapdjpssVnBz6.XXczpaakVbkkbkVIIJl9XX.1;7->3-3--::>>-;;:::::::::::::::::::::::::::::::::::::::::::222224,-98ijadkVVVbbbsjkx1;2544::,,,>::::::::::::::::<<::::222>>>>,;;3-4::1+iteupu*ti==**eeee****&tt&$rr&&991-->>>>>>>>>>>>>>>>>>>>>>52,,.X+6y9+.671----;:>2222222222::::::::::::::::>>>>>>>>>>>>>>>>>>>>,,>:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222::::::::::::::::,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>4422>>>;...1+666%&&&&$$$rrr$&**&&&++;<:-::<<<-::::::::::,,,:::::222:233->3,:--37:::::,,,:::::---<<<<<---::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,<<<;;::::::::-:,,,<<-$dkjjddddauaddduauuuuadddkkkkkVVVVkkkbVVVVVVVVVVVVZZZCACCZZCAQAbVZCAUQQQQACZVVZCCQCZQk #VUUZCUCVZCZVVVVkkkVVVkkVVVVZbkCCCUQQQCCCCCCCCCACCCVVbjjkkpaapaut**etuapdkkkknzh91X9HpajjsknznBnc891.;;,,-->33::::::>--;;::::::::::::::::::::::::::::::::::::::::::::::::47-.yitakkkbbVnnkdkx9-2344::<;;;::::::::::::::::,:-,::>3>>2>->3;444::<69*tau*ui8u*=eueee$&&*tttteettt991;;>>>>>>:::>>>>>>>>>>>>>2>--;..+96+6997111,;->>222222222::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>,33>>>>:>>,,>>:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222::::::::::::::::,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::;;;;;;;<<<<<>>>>:::>><<;--;;;;;;6666%&&&t*&*eeee&&+..<::::<<<-::::::::::,,,,,,,,3>>225>32>>23325:::::,,,:::::---<<<<<:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,<<<;;::::::::::,<<<<<$uauuaddddppdduteeeeuauudjkkkkkVVbkkkkkkkkkbVVVbbVVVVZZZZZZCVZZVZVZCAAAQACCAZZCCCUCPQCa#kkVCUVVVZVVVVVbkkkkkkkkVVVVVkjVCCCCCCCCVVZCCCCCCCZZVbjsjjpaaaute&&***upkajVnkxkx8XXzkpjjxkkxxxv.X.-,33:-73:--:33:---;,11::::::::::::::::::::::::::::::::::::::::::::::::43-.9iuujkkkbbbbkdkk9X,3::<<;;;;::::::::::::::::,::,::>37>>>->>-4444--66ttuu*&8ytuuteeuu***&&eterrett991;;>>>>>>::>>>>>>>>>>>>>>22,<;<66+.+6667f61--->>>222222>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>3,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222::::::::::::::::,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::---<<<<<<<<<<:::<<<<<;;<>>>;;;;;..11+++%t*&*eettr&+..<,:2::<<<-:::::::::::,,,,,,>>>3>--32>:5::::::::::,,::::::-----<<:,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,<<<;;:::::::::::<<<<<&te*reudpddddattrretuauudpdjjjjkkjkkkjdpddskbVbkkkbbVVVVCZCZVbVVVVVVZVZZZZAAZZZZZVZCPUk=#=wkVbkVVkkVkkkkkkkkkkkkkkkkaabVCCZZCCZVVVVVVVVVZZZZVkpppauuutee&*&&*upksjbkkkkkh66lxxBJHhXXX11<-::3::::X-:,33:-,>>,,>--::::::::::::::::::::::::::::::::::::::::::::::::44-;9ii*jkkkkkkkddjj9.,::<<-;;;;::::::::::::::::,::,:-,37,>2>5>54444-..+t*tu8 +hyyt&*te$eee*&*etrretyy91;;>>>>>::>>>>>>>>>>>>>>>233<-;67666...696<..-<,>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>:>,>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::---<<<<<<<<<<<<<--<<<;;<,,>>2222-.;;...+9yttetttt*+..:2::::<<<:::::::::::::,,:--;;;;;<;--->>---3::::::::::::::::---<<:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,<<<;;:::::::::::<<<<<*tteeuudaauuuuttrretuuueuuappadddppppppppskkkkbVkkkkbbbVZVVVVbbVVbbbbbbVVVZZVVVVZVVVVVVa*apkkkkkkkkkkddkkkkkkkjkkdpsddVZCVVVVZZVVVVVbbbbVVVVkjppauuteer*rr*rtuaaaasjkbkkncvvlzHx91.11;--33:---::,3,---,,7,-->,3,::::::::::::::::::::::::::::::::::::::::::::::::4:>;6yi*jjjskkkkdajh9.<-<<--;;;;:::::::::::::::::::,:-,77;-,>>>24444:;66y8*t9XXhyy88yit**ee*&&etrrrt8991;;>>>>::>>>>>>>>>>>>>>>>33,<-;<6f7....1666.;<<;,>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>:>>>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<<<<<<<<<<<<<<<--<<<<;<-->>>222;;;;;;;.6yitetauyt+.-:44:::<<<<<::::::::::::----.X.9f71.<;,13,--::::::::::::::::<<<<<---::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,<<<;;:::::::::::<<<<<&ttttuapdpaueeetrrreeeeeuuuaauapjpaaauuajkkkkkbVjkjjkkkkkbkbbbbbVVbkkkkkkVVVbkVVVVkkkVkkkNkkkkkkkkkkkddddpdkddddkdapkkVZVVbbVVVVVVVVVkjpjjkkkppaauterr*&rtteeeee8ukkkkjkjxx9616X;;,,:-37-::,,,,;;-----,1Slg7---<::::::::::::::::::::::::::::::::::::::::::::::::3-;;.9i8pjjppjkjupjh6.<-<<--;;;;:::::::::::::::::::,<-,77;-,,>>>444:<<69yyt99.X9.+9y9&8i$*ee&&*er&&&%96;;;>>>::;>>>>>>>>>>>>>>>>3>:<,,<-96...16666666;-<<>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>:>>>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,,,,,,::::::::::::::::2222222222222222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<<<<::<,>>>>>>>-;>>;;;<.9y8&euuyt6.-2444::<<<<<::::::::,::-----+X9xNg.Xg6XX11;;,,::::::--::::::<<<<<---::::::::::::::::::::::::::::::::,,,,,,,,::::::::::::::::,,,,,,,,::::::::::::::::::::::::::::::::::,<<<;;::::::::,::<<<<<tyytttuapaueeeeerrrrrreeuuuuuuuapaaaaauujjjkkkkjdjppkjpsskkkkkkkbVbkjkkskkbbkbVZVkkkVNjdpdddkddkkkkddddauuddaapjddupkkVVVbbbVVVVVVkkjpaappppppppuutr&&&&eapu*&eutakkkksjjx|v;XX.-->>:::-::,;;...7.X;1;.;71-X--->::::::::::::::::::::::::::::::::::::::::::::::::3-;;X6y8uhjpuapjahh9XX,<<<<<<>>2:::::::::::::::::::,--<77;-,;;>>22>><169yyy961;,XX196++*&euue**eer*&%961;;>:::;;>>>>>>>,>>>>>>>>,:-,37,-<<11..6766696;-;;<<<<<<<::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,,,,,,::::::::::::::::2222222222222222:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<,,,,;;;;--->::>;.66%@$rty9+.-4444::<<<<<::::::::,:---:,,+9hNxy+Xlg1...;1,,,:::::---:::::<<<<<:::::::::::::::::::::::::::::::::::,,,,,,,,::::::::::::::::,,,,,,,,::::::::::::::::::::::::::::::::::,<<<;;::::::::,,:<<<<<yyytteeuuee*****rreeeetuetutuuuuuuuaaaddppapjkdddjaajpappjjkkkskbbkkjjsddskkkVVVkkddkkddddtdddddkddaauuuuuuueeudddpkkkVVbbVVVVVVVkdaueuaaapppppatut*$$&&eadu**eu&8pkbbmmjqv1;1<.72:-:333>,;XXX9vLc1....1.;<133,:::::::::::::::::::::::::::::::::::::::::::::::::>;;1..98*ipaiaaahjh6X.,-<<<:>222:::::::::::::::::::,--171.;;->2>2>>>;169yyy9.;;-6<.669%o*upduteeer**999;;;>:::;;>>>>>>,,>>>>>>>>,>>,33,<;;166..6.+697<.;;;;<<<;;::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>:>,,>>>,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,,,,,,::::::::::::::::2222222222222222:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<;;;;;;;<,,,>>>,;..@OO$et9+.-4444::<<<<<::::::::,:--:,37yhhy++++lhg99.X.,,,:::::---:::::---<<:,,::::::::::::::::::::::::::::::::,,,,,,,,::::::::::::::::,,,,,,,,::::::::::::::::::::::::::::::::::,<<<;;::::::::,,:--<<,@9ttt**eueeeee*=&rreetuueuuuuaauueuudappppddppdddduudpuppaakVkskbkkkksdddddskkkkddddeuddddruddddkaetttttuuuteeetuddkkkkkkbVVbbbVkjpaueeuuuapppauete&$$&&&ee*eee=9tjkkMsjjjlv;,<<2::33:-:-1999hzKWhXX11...;;----:::::::::::::::::::::::::::::::::::::::::::::::::;;;1.X+9&8uipjp8jch6X,,-<<<:>424::::::::::::::::::,,--17..;;-,3>>>>,;.66y999X.35..<..6&%8uppauuee&&&996X;;>::;;;>>>>>,,,>>>>>>>>33,,>;<;<..6976X..+671.-;;;;;;;;::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>:>,,>>,3,>>::>>,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+"::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222444444444444444422222222222222222222222222222222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222::::::::<<..698yt*+X;344444442><;<24444:.X@&Oo****ta8ukjjaiii&O ......<1.76.X.<..1;-,254444:<<<<<<<<<<<<::::::::::::::::::::::::;;;;;;;;>>>>>>>>--------:::::::::::::::::::::::::::::::::::::::::::::::::::::::::37999ttteett*&**ettttee*tuaauaauaaaapppjppaapjkdddduuaaaaapdddkkjkkdkkduuuuddkkjduaaaaddduuaddauutteeeeuterreetdpppdkkkkkkkkkkkkdddauteteeeeteeer&&$$$reeee**eue&ukkkbkbsCU=X% XXXXX9hksVkVUbnUTxXX.-::4444:>>>::::::::::::::::::::::::::::::::::::::::::::::::,;>:::<.ytujksdjdda+X,3444:;;;..::::::::::::::::>>>>>>>>-:::>>>>;-:44477yy9+.-44<,<<,699*ddeau*uy99997;-222>>;;-:::>>,--<<;<<<<:;.<13,>>,-.699@O++66+XX.<>:4442,::::::::::::::::>>>>>>>>>>>>>>>>>>>>>,,,>>>>>>>>:>>>>>>:>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222444444444444444422222222222222222222222222222222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222<:::::::<<..69tytt+X.,5444444>;-;<24444<.+*t&#%&t$tpiaa*pu8*&%O +66+.XXX.666666..77<>:53444::<<<<<<<<<<<::::::::::::::::::::::::;;;;;;;;>>>>>>>>--------::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,669tytteee***eeeettteeeetuuapaaaaaappppppppppddkjdapaauapddjkkjkkdjkdduuuapppdduaddddddauuaddtuutereeter*reetaaaudjjdpppdddkkddauutteeeeeeeeeeer&$$$&eee****et*uspsbbbnUQVi X8hlchxBPUQZAUCCCRlX11;--444::>>>::::::::::::::::::::::::::::::::::::::::::::::::,>>::--.9yakVkkkjpi6X-:444:<;;;;::::::::::::::::>>>>>>>>:::>>>>><;>44437yy&+.>44<:;;;166&aurer=ey9966;--22>>><;;>>>>,,;-,,<<;:::.;<73>:>,<<699&@.+6++XX.<>:44:::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>,,>>>>>>>>:>>>>>>:>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222444444444444444422222222222222222222222222222222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222<:::::::-<..699ytt+X.;-2:33>:,<;;<,444:<.9tt*$&8@Opp&**ujpit8tt*9999++X++69999+X697;;,>2244::<<<::::::::::::::::::::::::::::::::;;;;;;;;<<<<<<<<--------:::::::::::::::::::::::::::::::::::::::::::::::::::::::::--..+9yiteee**ete**eeeeee*euaapaaddaapppaaappppddjkpaaapaapdjkkdpdddddadueuapppkddddddddddateuutuuueretteereettuueeeuauuuueeupdaaueeetuteeeeeeeeerr&$$&eee*eeeeteuppkbVVCVVPBkzJITTPPPUQAAQAQQQYqX11;:::4:::>;;::::::::::::::::::::::::::::::::::::::::::::::::,>>::--.9y&uaasjkpi91--344:>>;;;::::::::::::::::>>>>>>>>:::>>>>><<2442,6y9@ .,44--::;<1++*e&$**e966.;-<3>>>>><<<>>>>,,<-,,<:--::.<77,:-,-<;.+9&@7766....<>:4:::<::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>:>>>>>>>>::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222444444444444444422222222222222222222222222222222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222<<::::2:-<..6699et&++..<;,<..1<X..;,33<..9t*e**u&@t& &ttppu*&etttt88*&&&&&999&++991X.1,:2222::<<::::::::::::::::::::::::::::::::<<<<<<<<<<<<<<<<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,--...+9yttte*reer&&****&&*euuuuaaaaaaaaputtupddppjkdaaapaaapjjjdjkjdddadauuapjkdddddaaadddduer*tuuteeetteeeeeeeee*&*eeeuuueeeeuteeeetuuteeeeeeeerrr&$$&****euuuttupkbVVVVnVVPUIVVCPPPCCQAAACQQQzXXX;-,::::::>;;::::::::::::::::::::::::::::::::::::::::::::::::,>>:::-.+y*taajsc8996;-2:::>>>>>::::::::::::::::>>>>>>>>:>>>>>>>,>244>,6y&@ .,44--:::;;. o&t*tt*XX..<,,3:>>>>,<<>>>,,,>->>:-:>>>1113,::,-;.X+99+77711;;;<>::::<-::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3,>>>>::>>>>>>>>::::::::::::::::",
+":::::::::::::::::::::::,::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222444444444444444422222222222222222222222222222222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222<<::::2::,-.16+6%9&+++X....X.66...X.-<.X+te&ee*t$t&O Ou**te&$&r*e***tt**ettt*&%%%9+X.;;<>>22::::::::::::::::::::::::::::::::::::<<<<<<<<<<<<<<<<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,----...+9ttr&$re*****&&$&euuetuuuuuuuuuaueeupddkpjkdpppaauappjpdjjdduuuddddadddadpduuadddaauer&tteeeer*ee*&**&&rr*&*eeeetute*&*e**eeeeeteeeeeeeer&rr&&&****eeue8uapjjkkssbVVPUPCCVCQQQQAAAAACCQxX1.--,::::::;;;::::::::::::::::::::::::::::::::::::::::::::::::;>>242,;X98upjkkh99997-::::22242::::::::::::::::>>>>>>>>>>>>>>>>,>242;169&&+6<44-:,2:--.XX9yyyy+..;<<>>::>>>>,<<>>>,,,>:>>>:>>2371;<,>>,,,..699+771;.;;-<>::::--::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3,>>>>::>>>>>>>>::::::::::::::::",
+":::::::::::::::::::::,,,::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222222222222222222222222222222222222222222222222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222<<::::22:3;.;...+%&+%+ XXXX+999996.XX.++tyteee&# tt& Ou*$&***reeeeeette*uapaue*$+996+XX1<,>:2222::::::::::::::::::::::::::::::::,,,,,,,,<<<<<<<<::::::::,,,,,,,,::::::::::::::::::::::::::::::::::::::::-----------<<;..X6yterrreeeee*&&&*eeeeeuuuuteeeeuteuudpdkppdpappaaaapphpaddpdueueaddpdppddddutuaduteuuteteeeeee&r&&&&&&&$$$$&&&&*retterreeeeeer*eeeeeeerr&&&r&&***e*****8apuu*waaskbVPUUCCCCCUAAZAACAAQ~h;11--3::::::;;;::::::::::::::::::::::::::::::::::::::::::::::::>>22443<1998ikkjg69yg91.;<>22444::::::::::::::::>>>>>>>>>>>>>>>>2222>;1+9ee96<44<,34:::-..9yy99.<<,;->2>4>>>><<<<<>>,3>:>>::>3337<--,,>>,<..696 ;;;.166-;>:2:<--::::::::::::::::>>>>>>>>>>>>>>>>:>>>>>>>>>>>>>>>>>>>>>>>,,,,,,,,::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>:>>>>>>>>::::::::::::::::",
+":::::::::::::::::::::,33::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222222222222222222222222222222222222222222222222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222<<::::22:3:-;-.;X++699@@Oo+9y999y99+X+9yitte**&OO@$&ttt$$$$&&$&rewuuueeeapdauue=@&8y9.X1;<,>2444444222::::::::::::::::::::::::::::::::::::::::::::::::::,,,,,,,,::::::::::::::::::::::::::::::::::::::::-----------:,:;;.69tteeretter&&&re***reueeeeeeeeeeeeuaddkpaauuadaddaappiadppddadeaddddppdddaeeeeaueetuuutttttteee*&$&&&&$$$$$$$$&&reeeeteer*rr*&rrreeer&e&&&&&&&*eee***etaitt**udkkbVCVVbCCCCUQQAQAAAUUn1;-,->3::::<<;;;::::::::::::::::::::::::::::::::::::::::::::::::>>2444:;.+9ycx8%6.6999.X.;;>2444::::::::::::::::>>>>>>>>>>>>>>>>344:-;6+**e96<>3-<:444::<699961.-<<-:33322>>><;;;;;>,,>:>>:>23771;-;,>>>:-...+.X.116696;;:22::--::::::::::::::::>>>>>>>>>>>>>>>>::>>>>>>>>>>>>>>>>>,,>>>,,,,,,,,::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::",
+"::::::::::::::::::::,,33::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222222222222222222222222222222222222222222222222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222<<::::22:3>-,;-,X669yy99&&9y9.X.9y9+ Otpatt*$&e#@Ott**O*e&&rr$$rwuaawewwdddweuu*$@%yi9XX.;<,>222422222::::::::::::::::::::::::::::::::::::::::::::::::::,,,,,,,,::::::::::::::::::::::::::::::::::::::::--------<--:::>,.669tterette&$&*e*&*eeeerr*reeeeeerreuddjauauuadadduuut*euuudauddddddddpuuueeeerttttuuteettteeeee*$$$##O$$$&&$$$&$&&&&rte*&&**rr&&*rer&&e&&&&&&&&*eeeeuuuittppuaadkbbnCnbnbmnQQQQQQQCUPqX1-7-:3-::::<;;;::::::::::::::::::::::::::::::::::::::::::::::::>>2444:-1X66hx%X;.699y&+X.;>>244::::::::::::::::>>>>>>>>>>>>>>>>344:-.66&&&96<->-<:44444,797<.-,->32232:222>>;;---->>>::>>:>3377;-;,,::>>;<<...+X+++996..;:22:--::::::::::::::::>>>>>>>>>>>>>>>>:::>>>>>>>>>>>>>>>>,,>>>,,,,,,,,::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::",
+":::::,,,::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222::::::::::::::::::::::::2222222222222222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222<<::::22::>>>>>>;;<66699y999.X<6+999&&idtte$$$*&@&*e&&&rer&&&$re=*wuaaadaapdu*=O$OOO@%%6X..<3325,33333::::::::::::::::::::::::::::::::::-------------:::::::::::::::::,,:::::,,,:::::::::::::::::::::::::::::,,,<<::442>-<69*eee&tt&&*e**er&*eeeeetteeereeereuutptuueudadueetutee&tpduddddddddpper**rr&$&&reeeeeeeeee*&&r&$OOOOOO$$&&$$$$$$$$&&&ee**er&$&*reeerrr&&$$&&&&**eeuap8tipppappkkbmmCmmmmmmbVCCQCCPPj0>>>>>>::::::<;;;:::::::::::::::::::::::::::::::::::::::::::,::,3;>>4442>-..9996X;;69y&%&XX;;>3::::::::::::::::::>>>>>>>>773>>>>>443>-.++998y96<<<<-:4444:<<<<:::>>>2222222>>><;;<,,>>>>>>>>33,<-<;;;:>>>>-;<.699o@&&&&+6.--::2::::::::::-:::::,3>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::",
+":::::,,,::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222::::::::::::::::::::::::2222222222222222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222<<::::22::>>>>>>--;;...+99g96.-;.999&*tette$#$&&&&**&&&&e*&rr&&rw**wuuadauaae**=$OOOO@+++...<,32---::---::::::::::::::::::::::::::::::::-------------:::::::::::::::::,,:::::,,,:::::::::::::::::::::::::::::,,,<<::4442;<699e&$&&&&*****eereeuuuuttteeeeeeretutduuueeueeeeeeeeeeeaduuadddpddate&&&&&&&$&&&reeee&&&&&&$$&&$OOOO#$$$$$$$$$$$$$$$&**&&*&&$e*$$$&rer&$$$&&&&&*euuaa*8apauaskkkbVbmmmmmmmmbbbbVnJz6X>>>>>:::::::<;;;::::::::::::::::::::::::::::::::::::::::::::::::;;>24442;.X.11.X;;6yy*&to..;<:::::::::::::::::::>>>>>>>>33,>::>>442>-..++%9yy9...<<:4444:::<:::4>>2222222>>>><<<<,,>>>>>>>,,,<;;;;;;:>>>,-,76797$$$OO@@+X--:444::::::::::::::,,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::",
+":::::,,,::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222::::::::::::::::::::::::2222222222222222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222<<::::::::>>>>>>22>;....+6gg7---X999ttu$&*$OO#$$***&&&&&&$$&&$=*t*=*etuuu*uut*8t&$OOOO@@9+...;,,<<<<<<<<<<<,,,,,::::::::::::::::::::::::------------::::::::::::::::::,,:::::,,,:::::::::::::::::::::::::::::,,,<<::2442:<169ye&&@@*t*&&&***eeuuttteeeeettterreer&eeeuddaauuttttetaaeudaddddue&$$$&&$$$&&$$&&rrr&$$$$$$$$$#OO#$$&$$$$$$$$$$$$$$$&&&&&&&&e&$$$&rrr&$$$&*reeeeuuuu*8uauupjbbbmVbMmmmbmmmmbVbVVIhX;>>>>:::::::::<;;::::::::::::::::::::::::::::::::::::::::::::::::;;>24442,<..X..;>;69t*&*&+.;,--,::::::::::::::::>>>>>>>>>>3,>:>,442>-.....69y9+X..<,44444:::::44>>>>>>>>>>>>>><<<,<>>>>>>,<<;...;;;-->>>>-,77761OO$$&&%+X.-:44::::::::::::::333:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::,,,::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::",
+":::::,,,::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222::::::::::::::::::::::::2222222222222222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222::::::::::>>>>>>22>,<<<<.177;-,3.669iaa$#$#OO#$$**e*&$$&&&$$=*eee*=***=$=$*it***&$OOOO@@&%+...;,;;;<<<<<<<<<,,,,::::::::::::::::::::::::<<<<<<<<---::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::,,,<<:::22:,<-<6999&&&ttt&&&&**eeeeeeeeeeeretter&rr&rettuppphpitteettaueeuadddde$$*$&&&&&&&$$$$&&&&$$$$$$$$##OO#$$$&$$$$$$$$$$$$$$$&&&&&&&&*&&&rr&&r&&&&*reee*eeuuet**tuajbkbbjmbsmkmbbbbnVbVnIH1,-:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,;;>24442:<<<;;<,2;69&$$%91->3--<::::::::::::::::>>>>>>>>:333>:>3:>2>---...+699+ ...-2344::::::44>>>>>>>>>>>>>>>><<>>>>>>,<;;...X;;---:>:>-37<;;. O&er&@+.-::::::::::::::3:-:333:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::",
+":::::,,,::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222::::::::::::::::::::::::2222222222222222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222::::::::::>>>>>>>>>;;;;<-.-;--333<16itt#$%%%%&&$*tut*$&&&**eeuuut*&&&&#O$#*u*%%%%#OOOOO@@%96...;.......-<<<<,,>>::::::::::::::::::::::::<<<<<<<<--:::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::,,,<<<:::::,,<...<6&tyytt*&8eettettttuuutee$&eeerre$euiphccchiiiuttutudteudkdde$$&e&&$&&&&$$$$$&&$$$$&&$$$$$###$$$$$$$$$$$$$$$$$$$$$&&&&&*r&&rrer&&er&&&&*&&&*euuu*t***upkVbbVbsbksmmmbnCCCnVVIhX3-:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,33;;>>2442--<<<,:-4>16&&&96;-23:-<::::::::::::::::>>>>>>>>>333>:>3:>>>>---,<169t&@+..->334::::::::>>>>>>>>>>>>>>>><<>>>>>>,;.16+.X<::-->>>,,77-...@&*&@  ..-:::::-::::::::3:-:33,:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::",
+":::::,,,::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222::::::::::<>>>>>,,,<;;;;;----:,-4-.+itu&&&&&&&$$*wuu*&&&$*tuuauut*$$$##$*$&*$OOO@OOOOOOOO%996..;........;<<<,,>>:::::::::::::::::::::::::::::::::::::::,:::::::::::::::::::::,,,:::::::::::::::::::::::::::::,,,<<<<<<::-<,<-.-<+8yyyyt&ttttteettuuuuuee&&reer&&&ipphhhhg999yyiiatudddkkkar$$&&&&&$&&*&$$$$&&&$O$$&&&$$#$$$$$$$$$$$$$$$$$$$$$$$$$$&&&&*r&&&&&rrrerr&&&&$&*euuu*$&*euuakVCbVCbbbkmmmbnCCCCCUBX.>3::::::::>>>::::::::::::::::::::::::::::::::::::::::::::::::::337;;;>244>:-----::4:<698891;544:-<::::::::::::::::>>>>>>>>>>3>:-:>>>>>>>>>><<698&$9+1;<>:5>>;<::::<<<<<<<<<<>>>>>>;:>>>>>><;.66++ >>>:>>>>>;3,-.<<+6996+X..-:::---::::::::,::::3::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::",
+":::::,,,::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222::::::::::<<<>>>,,<<<;<<<-;,;<,-4--.itpt%%%%&&$$ww****&&&*ttuuuqe&$O##$&e&&$OO@O@@@OOOOOO$&9966666666661;;;;>>>>::::::::::::::::<<<<<<<<<<<<<<<<::::::,,:::::::::::::::::::::,,,:::::::::::::::::::::::::::::,,,<<<<<<<<--,3,::3o+&9yyt*t8*ee*etuuutteeeerree*&&app896.;;.XX+%*tutadddkkae$$$&&$&&$&&*&&&&&&&$$O$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#$&&&&&*&&&&&rrreeeeer&$eetut*=$rreaaasmnnVCZVVbmmmmbCCCCCUhX;-3::::::::>>>::::4:::::::::::::::::::::::::::::::::::::::::::::,33.;;>242>,<<---:444;6+%99;24444:-::::::::::::::::>>>>>>>>>>:::>>,>:::>2245:-.+&$O+666,-::><;;;:::;;;;;;;;;<<>>>>>;::>>2>><<666+@O,,>>>>,,>--;-;<;.17996..-;:::--.::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::",
+":::::,,,::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222:::::::<<<;<<<>>;;---;;<<-,,--,;44,Xytpe%%%%&&&&u******&ett*8uuu$OO#$O$$e&&$@$#O%%%#OOO#$$%&996669999666;;;;>>>>::::::::::::::::<<<<<<<<<<<<<<<<:::::,,,:::::::::::::::::::::,,,:::::::::::::::::::::::::::::,,,<<<<<<<<,,::::::XX 9yy8ttt8ttetuuuuteeee*$$reeetey& XXX;;;.XX+*taaaaudda&rrr&&$&$&&&&**e*&&&$$$$$$##$$&&$$$&&&&&$$$$$$$&$$###$$$O$$$$$&&&&&reeereeetter&ee****eutreajssasCVnVVVVMmmmbbCCCQV=0X>4::::<::>>>>:::44::::::::::::::::::::::::::::::::::::::::::::::33.;;>222>--<<--:444-.X XX;24444:-::::::::::::::::>>>>>>>>>>::>333<--->24442-.+@$$o+96,->3>;;;;;<:;;;;;;;;;<<>>>>>:::>>2>,;166++@@,,,>>,3,7--;<,,.;;;661..;;:::-..:::::::::::::-::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,,:::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::22222222222222222222222222222222,,,:::::::::::::2222222222222222::::::::222222222222222222222222222222222222222222222::::::::::::::::::::::::::::::::::::::::::::::::---::::::::,,,<;;--;;;;;;;;4:<6hiue$$$$&*tu*eeeeeeeeetuute*OOOOOO##&$####OO==%%%%%o##%%oooo#ooOOOOo@++.X-<,;;>>::::::::::>,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3;;1699ttt*&*tyiyyyyyyyyy9yyyyy9::::::::,:,3-:7gdauaddt&&eerr$$$$**$$ete&&&&&$%%$$$OO$&$$$$$&$$OOOOOO#$$#$#@OO@#@$$$$$&&rrreeeee*=uaapuwaaw*uaapduuasssmmbbbVZZVbbbbVbbUCPhX;:44::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::333:::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>,>::37f6+   +X.>22:799+oo@+++..>2444:-->><<<<<<,,3344444433;...+%%OOOOO+++..;<,>>>><;;;>>>:;;;;;;;-->>2>>>>>>>>:::>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::22222222222222222222222222222222,,,:::::::::::::2222222222222222::::::::222222222222222222222222222222222222222222222::::::::::::::::::::::::::::::::::::::::::::::::---::::::::,,,<;;--;;;;;;;;4:<6gyte&$$$*uut*****eetttuuut*&#OOOOO##&$###OOO===%%==&#%%#ooooooOOOOOO@++..;;-;>>>::::::::::,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>;;16999&&8yiy8666++666yyy99+XX::::::::::,3:-7fttipppy&tt&$$$$=**&&$&****&&&&&&$$$@#$&&$$$&&$$#OOOOOO$$$%%#@@#%@@$$$$&&rreeeettuwaapjspaaaaaauuadaassjbbbbCCCZVVbsVVbUbPk0X,:44::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::333:::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>,>:->7766+++++1-22>199+ooo+++.;>2444:-->,,<<<<<,,:44444443,;..+++@OOOOO+++..;;>>>>><;;;>>>:;;;;;;;-->>2>>>>>>>>:::>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::22222222222222222222222222222222,,,:::::::::::::2222222222222222::::::::222222222222222222222222222222222222222222222::::::::::::::::::::::::::::::::::::::::::::::::---::::::::,,,<;;--;;;;<<<<4:,6iyt&e*&&tau*****eeuuttttt*&##OOOOO#$$$##OOOO#=8uu8*%%%%@oOOOooOOOOOOo++666<.;<>::::::::::>,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2,;...+9yyy9+XX..XXXX...+66....:::::::::::3:-:7iphhhhy&tt&$&&*et&$&&&&*e*&&$%%%#$$$$&&&$$&&&$$$#OOOOO@#@##@OOO@@@$$$$$$&*eeeeetaappskkkksuuppauuaaapsknnmnCbmbVVbmbVnnVV0X;-:44::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::333,::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>,>:-:,3666++++6.>,;<666oooo++11>2444:--,,:::::::::4444422><;;.+ ooOOOOO+++..--->>>>><;;>>>:;;;;;;;-->>2>>>>>>>>:::>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::22222222222222222222222222222222,,,:::::::::::::222222222222222222222222222222222222222222222222222222222222222222222::::::::::::::::::::::::::::::::::::::::::::::::---::::::::,,,<<;;;<<<<<>>>2:16iye&te&euut&eeeeeeuuee**&$#O#OOOOO#$###OOOOO#=8uiu*#&&%oOOOOoooOOOOOO@+6996.;::::::::::::>,>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::422>-...+696.XX.........X.;;...<:::::::::::3,:::9yy996+++9988**et&$&***e**&$$##oO#$$$&&&$&&&$$$$##OOOOOO@@@OOOOO@$$$$$$$$&&&&&etapkkkkkkkjuupjpuuaaaskbnnmbnsajbbbbkbnbTqX11-34:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3333::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>::>,1666+++6.;;-.669@@oo++.;>2444:<<<<<,,,,2222222::;;;116++ oOOOOOO++..;--:222>>><<2>>>><;;;;;-:>>2>>>>>>>>:::>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::,22222222222222222222222222222222,,,:::::::::::::222222222222222222222222222222222222222222222222222222222222222222222::::::::::::::::::::::::::::::::::::::::::::::::---::::::::,,<<<<;:>>>>>>>>2-1+yttet**uue**eeeeeeee&&&&$$####OOOO#%OOOOOOOO==**uu*$&&%#OOOO%oooOOOOOo++9961-<<:::::4::::>,>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::444::--..XXX.<<<<<<;;<<<;;;;--;;::::::::::::,:::.11.XX...669yt***&&$&ee*&&&&$#ooOO@@$&&&$&&$#O$$##OOOOOO#%%%@@@@@$$$$$$&$$&&$$*eupkkksakskkspaapajpskbnVVmmbjskskbkbkkPlXX7;-3-:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3333::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>:>>>>>>,1666+++661....69@@o@++..;>444:<<<<<,,2244:::::<<..;66++o ooOo@@O...;;;>22222>>>>2>>>>><<<;:-:>>2>>>>>>>>:::>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::,,,,,,,,::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::,,,22222222222222222222222222222222,,,:::::,,,,,,,,222222222222222222222222222222222222222222222222222222222222222222222::::::::::::::::::::::::::::::::::::::::::::::::---::::::::;<<<>>>>>>>>>>>>,;.X8*tt*&*ut**ueeee*&$$$$$$$#$$##OOOOOOOOO#O###=*uuaue&&&$#OOOO%#@o#OOOOO@+++++-<<<::::44:::>,>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::44444,--<<<----->>>>>>>>:--:,333::::::::,:::::::;;1,;;<<61X+iit&&*&$&e*$&&*&&%ooOOOOO$&&$&$$OO#$##OOOOOOO@#@@OOO@@$$$$&&&&&&$&&ewajkbkusjkkspaassjsjkbbbVbmjsssssbkkbBlXX;;-33-3::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3333::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>,,,;11+++++96+..X.6@@@@%++.;>24:::<<<<::4444::--;..X.+++++o ooo@%+o...;;>2222222>>>222>>>>,<::::>>>>>>>>>>>:::>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::,,,,,,,,::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::,3322222222222222222222222222222222,,,:::::,,,,,,,,222222222222222222222222222222222222222222222222222222222222222222222::::::::::::::::::::::::::::::::::::::::::::::::---::::::::;;<<>>>>>>>>>>>>;..+t*ee&*tt*&*eee*&$###$$$$##$$#OOOOOOOOO#####%#*appu*$&&$$OOOO@ooo##OOO@@@++++.--<::::44:::>,;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::44444,:---,3::33>>2222>>332>>::-::::::::::::::::;>>>:>:-71X+yit&******&&&*&&&#ooOOOOO$&&$$$$OOO$@@@OOOOOOOOOOOOOOO@$$&&*e*&&&&&**upjVVsskbksssspjjsjkjsjbmsawwaskbkjxlXX<,--3>->::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3333,:::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>;;..X+++996++X.6&%%%%++.;:>4:::<<<<:24444>>;;...+++++o ooo o+%+ .--;>>2224222>>>22>>>>>>>::::>>>>>>>>>>>:::>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,::::::,::::::::::::::::",
+"::::::::::::::::::::::::,,,,,,,,::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::,,3322222222222222222222222222222222,,,:::::,,,,,,,,222222222222222222222222222222222222222222222222222222222222222222222::::::::::::::::::::::::::::::::::::::::::::::::---::::::::;;<>>>>>>>>>>>><XX+%it*&&ui*$**&ee*&$##$$$$#OO#%OOOOOOOOO####O#%#eaau*&&&&&$OOOOoooo###OOO#@@%%%...<<:::444:::,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::4444:::-3:--334->222222>::>>>222:::::::::,3:::::32>5:233;;X+9t*&t&*tt&&e&&&$#oooOOOOO#&&$$$$$OOO@@@OOOOOOOOOoOOOOO@@$&&et*&&&&&&uaapCUbssbbkjspajjjmmsssksaaspdsbkjBhX;,-3:4:-7-::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3333,:::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>,>:::>>:,,;..+%99&99+XX6t*%%@+XX;;>::::<--<:::2223,11..++++@o  OOO  +%+ --;<>>>422222>>>>>>>>>>>>::::>>>>>>>>>>>:::>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,::::::,::::::::::::::::",
+":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,333::::::::::::::::::::::::::::::::222222222222222222222:::22222222:::::::::::::,,,222222222222222222222222222222222222222222222222222222222222222222222::::::::::::::::::::::::::::::::::::::::::::::::---::::::::;<<>>>>2:::7-,--699y*&tett*&###$$&&$#O#$$@O@%%@Oooo##ooOoo%%%%%%$*e**tut$$&$OOOOoooo#OOOOOO#O#&86X.6<<-:::::::,,::::::::,,,:::::::::::::,,,,,,,,::::::::::::::::,,,:::::::::::::::::::::::::::::,,,,,,,,::::::::::::::::::::::::>>>>>>>>:>>>>,33,:::::::::::::::>555222:-.X+&8t***&&****&$#$#ooo#####$$$$#OO#$$&$$#@OOOOOOOOOOO@OOO@@O#&t*&&&**&*uasVPbsqkVbspsjmkjmmsssjdadddpjskzi+X-3:444:>;;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,3,::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>,31;..++%@@+++++ %*&oo+6;,3::-<,---:33223,;.66++oooOOOO OOoo++++;--->222::>>2>>>,:--:>,>:>,,,,,,:>>>>>>:>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,333,::::::::::::::::::::::::::::::222222222222222222222:::22222222:::::::::::::,,,222222222222222222222222222222222222222222222222222222222222222222222::::::::::::::::::::::::::::::::::::::::::::::::---::::::::<<>>>>227,-,X;.;9y8tt*tett88&&$$$&&$OO#$#OOO#%%@%#oooooooo#####%#$&$$*e*$$$#OOOO%@@@oOOO#####o%*h96.X<,-::::::::::::::::,,,:::::::::::::,,,,,,,,::::::::::::::::,,::::::::::::::::::::::::::::::,,,,,,,,::::::::::::<<<<<:::::::<<<<<<<<;;<,,,,,,:::::::::::::::>>>>222:,;.+&8*&t*******$#OOOoooOOOOO@##OOOO#$$$%%#@OOOOOOOoOO oO  OOO$**********uuakVkjsbnkssjbmkjsssssdddaauapkj8 X;:-4444:>;;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,3,::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:,,<;66+&&%%&999  @&*&+..<>:::<<---::,,<;...+++@OOOOOOOOOOOoo+++,;--:>>>:>>>>><;<<<;---::>,,,,<;:>>>>>>:>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,333,:::::::::::::::::::::::::::::2222222222222222222222::22222222:::::::::::::,,,222222222222222222222222222222222222222222222222222222222222222222222::::::::::::::::::::::::::::::::::::::::::::::::---::::::::<<>>>222>>-1.<<6iy&*e*t**888*&$$$$$$OO@%@OOO@%%%%%ooooo#####oo#%O$$##$&$$$$#OOO#&&%@oOOO####OO#&yyhyX.,:::::::::::::::::,,,:::::::::::::,,,,,,,,::::::::::::::::,:::::::::::::::::::::::::::::::,,,,,,,,::::::::<<<<<<<<<<::::::;;;;;;;;;;;<<<,,,:::::::::::::::>;>>222:<..+&*&$&&&&&***$#OOooooOOOOOOOOOOOO#$$$##@OOOOOOOOooo oOO  O@&&O$&&***eteeuaskjkbbbkbbnbmmsssddadauuuuu8%XX.<::4444:>>;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,3,::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>-----<.X+OOO@%%6o OO%&%9.<<:::<-::---<<11..+++@oooOOOOOOOOOoo+++,,<;<><;,,,,,<<;-<,<;--;;,,,,,;->>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,:::::::::::::::::::",
+":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,33::::::::::::::::::::::::::::::22222222222222222222222222222222:::::::::::::,,,222222222222222222222222222222222222222222222222222222222222222222222::::::::::::::::::::::::::::::::::::::::::::::::---::::::::>>>>>22>-,,<.X.9y*%*te**&***&$#O#$$$#@@#@OOO@%%%%%oooo##%%%#o@%%O$$#O#######OOo#&&%@oooO#####o#%#*kc6X.;-:::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<<<<<<<<<,,,,,,<<<<<<<<;<<<<,,,,:::::::::::::::;;>>222:<..+&**&&&&&&*&&*$OOooo@ooooOOOOOOO#$$$$@@OOOOOOOOOooo oOOOOO&%OO#$&&&&*t&euwassjjjbnVVbbbbkssaudauuii8+XXX1<-:34444:>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,3,::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>---::,;XXo@&&&%%%@OOOO&y61<:::<-2::--<666+++%@oOooOOOOOOOOOO@+++73,;;<<,<<<<<;;;.<,,<-;,;<,11<;.>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::33:::::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,::::::::::::::::::::::::::::::::22222222222222222222222222222222:::::::::::::,,,222222222222222222222222222222222222222222222222222222222222222222222::::::::::::::::::::::::::::::::::::::::::::::::---::::::::>>>>222>,,.X..+98&8uut&&88**&$##O#$&$#@OOOoo@@@o%ooooooo@@@oooo#O##OOOOOOO##oooo%%@@Ooooooo####%##pj8+X;;:::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;>>>>>>>>>>>>>>,,,,,,,,,,,,,,,,,:::::::::::::::;;>>>:::,;698*&&*****&&$&$OOooo%oooooOOOOO##$$$#@@OOO@@@OO oooooOOOO#&%O$&&&$$$&e$&e**aaasskbnnnnbmkjsduau8ui9+X1..;,-:2444::::>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,3,::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>><,,3773..+%&*&&%%%%&&&&966,::<<-44:--166+@@@@oO ooooOOO@OOO@@%@@77,--<,6<<<<<;..;161<-;<;<,11<..>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::33:::::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::-:::::::::::::::::::::::::::::::2222222222222222::22222222222222:::::::::::::,,,22222222::::::::22222222222222222222222222222222222222222222222222222::::::::::::::::::::::::::::::::::::::::::::::::---::::::::>>>>222>3<..gy99**uaue$#8*&&%###O@$&$#OOOOoooooOooooooooooooooooOOOOOOOOOoo#@oooOOOOOoooo  ###%&==pkp9X;;>:44:::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>22>>>>,,,,,,,,,,,,,,33333,:::::::::::::::;;>>:44:,<699&$##%&***&$#OOOooo%ooooooO#OO##$$##@@@@@@%%oO    oo OOO@%&%%&&&&**et&&&=*uaajkkkbVCVbkjjkjpuuui91.;7;->2>>2222>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,3,::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>-<:4377,X OOO#%&&@O#*t9+66,::-<<44:<..+&OOOOOOOo   ooo@@OO@&&&@@71<-;<16666666666661;---;<<<1<..>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,:::::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222:::2222222222222:::::::::::::,,,22222222::::::::22222222222222222222222222222222222222222222222222222::::::::::::::::::::::::::::::::::::::::::::::::---::::::::>>>2222>--;6chy9**ue**O#%%%%#OOOOOO@@@OOOOOOOOOOoooooooo  ooooooOOOOOOOOOoooooooOOOOOoooo  o#%=*=wdjji.1;>2444::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222233333333,:::::::::::::::;,,24444:-199%OOOO&*ee&&#OOoooo+ooooooOOOOO####O@@@@@%%%@o  o     O@%%&&#$$&****re&&**uaskksskbVnbkjjkjpuiy91;52-:333>>2>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,3,::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>.-:4443,1+oO##&&*&OO$t8++1,,:-<<444<..+@OO#$###o  o+ooo@O@@&*&@ ,<;;<1116666666661<;;---;;<<1<..>>>,,>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::33::::::::::::::::::::::::::::::2222222222222222:::2222222222222:::::::::::::,,,22222222::::::::22222222222222222222222222222222222222222222222222222::::::::::::::::::::::::::::::::::::::::::::::::---::::::::>>>222>>,<.Xy9&&t*u=$*###%%%%OOOOOOOOOOOOOO   Oooo  oooo oooooooOOOOOOOOoOooooooOOOOOoooo  o#%=*=wwwjh6.;>24444:::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222222222222,:::::::::::::::;,3344442-699&$$&*tttt&$#OO#%oooooooooOOOOOOOOOO@@@@#%%%@oooo    O@&&%#&&&&&&#O @e*$***uapawqskkbbkjssauui9.X;32344::225>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,3,::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>><<:4444>;+@O#OO#%&%OO**+X.<,,-<<444-.XO@#$$$##oo+++++ooOO@&*8&O ..-<11<..............<<<;;<<<...>>>,,>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<--<,6<->>>>>>>>>>>>>,,,<,,224223X.9it*&tu8$#&&O######OOOOOOOOO OOOOOOOO+++o  oooOOOOOO@oOOOoooOOOOOOOOOOOOOO@@OOOOO@#%&&$&*ut*+ XX.;;;;<<<<<,,:,2::3,::>>22224444444:::::::::::::::::::::::::::::::::::>>>>>>>>--:::>>>>>>>>>>>>>>>>>>>22222222222222222222222233333333>>>>>>>>>>>>>>>>:::::::<..+&&er#&*8&&**=%#oO##OOo@@oooooooo#####ooooo%%%oooooo    +@O#e**t96<::4O@&&%&t*u==uapknbmjddue*h9,>3>;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>2>,,.X.++@O%##O@&&6<773::::444:;166o@#$$$$#OOOOOOOO&&++99+X44;...,233;.X..;>>:::---<<,,,,;--;,,;...XXX.<;:4>22,;;;;;;<<,244..;;;:>>2222>>>>444>>-----;,>>::>>>22222222>>><<::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>,,,>>>>>",
+"::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<-<<777,,,,,,,,,>>>>>,,,<,,22422,;69yt&$ut*##$$########OOOOOOOOOOOOOOOOOoooo  oooOOOOOOOoOOOOOOOOOOOOOOOOOOOOOOOOOO#%%&&#OO&*8&+%+++1;..<---<--:2222,,::>>>222444444::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>22222222222222222222222233333333>>>>>>>>>>>>>>>>>::::::<169&&*=#o&*****=8=%###OO@@@oooooooo#####oooooo@%oooooo    +%O&t***+X<,44 @*&&&*t==*uapskbksdaue*96-:3>;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;::>>2>>,;..++@O%$#O@&&667733,,:444:;16++@@OO$$$OOOOOOOO@%%%99+.44;.+1<>2>;...;;,,,,>,<<;<,,,<;-<<,,<;..+XX.1<24>2>>;;;;.-;-::::;;;;;>::2222>>>;4322>:----;,>>::>>>>2222222>>><<::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>,,,>>>>>",
+"::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<<<<777,,,,,,,,,>>>>>,,,,,,22222;19yy*&*u8&#O#######$$#OOOOOOOOOOOOOOOOO       ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@###OOO#&*&%&996661.1..<<-->>22>::>2>>>>>22224:::<<<::::::::::::::::,,,,,,,,::::::::>>>>>>>>,,,,,>>>>>>>>>>>>>>>>>>>22222222222222222222222233333333>>>>>>>>>>>>>>>>>::::::<169*$$$#OO%%%&=%iu*$#OOO@@@ooooooooo####oooooooooooooo    +&&*e*tt+X<,:2 &**t8*u=waaaasjbksawe*&..-:2>;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;:>>>>>>,,<..+++#$$$$$@+667777,-442>;;6++@OOOO$$$#OO#OOOO@+9996.421+++1>>,16+61,>>;;;---;<,,,<;-,<<,16+.+ X.1<,3>2>>;;;;.-;--:::,,>>>>::22,,,<<;4222>><;;;;>>>>>>>>>2222222>>><<::::::::::::::::::::::::::::::::::::::::::::::::,,,>>>>>>>>>>>>>",
+"::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<<<<,<<-;;;;;;;;>>>>>,,,:::22222-69y8**eu*###OO#OO##$#OOo@@OOooOoooOOOOO       ooOOOOOOOOOoOO  OOOOOOOOOOOOOOO@@OOO@@@OOOOO#$&&&&&&&&%667;.<,;:3>222::23;;;>>>>>>:::<<<<::::::::::::::::,,,,,,,,::::::::>>>>>>>>333,,>>>>>>>>>>>>>>>>>>>22222222222222222222222222222222>>>>>>>>>>>>>>>>>>:::::<;699##$$OOOOO#==aut*$###@@ooo#oooooooooooooooooooo       o%&&****8+XX;--%t**aatauapauaskkjpue*%+.-:33>-;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<>>>>>>,11.X+++#$&&$$%%+66677,-333,<166++@OOO#$&$#OOOOOOO+6661.421+++1116666613<<;;----;<<<<<;;;;<,666++  X.;<,>2>>;;;11<<<;:::>>22222223,<<<;;:::>>,,<<;;:>>22>>>>>222222>>><<::::::::::::::::::::::::::::::::::::::::::::::::,,,,>>>>>>>>>>>>",
+"::::::::::::::::>>>>>>>>>>>>>>>>::::::::,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<-<<<-->>>>>>>>>>>>>,,,::>2222>-1988*&*t&###OO#OOO#@OOO@@@OOooO@ooOOOOO     ooo OOOOOOOOOoOO  OOOOOOOOOO##OO#%%##%%%#OOOOOO#$$$$$&&&&&&96..;--,33332233;;;>>>>>>>,<<<<<::::::::::::::::::::::::::::::::>>>>>>>>,,>>>>>>>>>>>>>>>>>>>>>>22222222222222222222222222222222>>>>>>>>>>>>>>>>>>::::::..69oO$#$#####=*uut*&&$#@@oOo#oooooooooooooooooooOO  O   o%%&****8% X117*ut*aauppaaauuskksaw*%+.<,432-;<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<>>>>>>,71.X.+6##$&&$&&@++6676<33,<;<16+++OOO$$*&#OOOOOOO++..<.42. OO+6666++113,,,,,,,,;;<<<<;;.;,,<166++ +..;<>>>;;;11611;;;--:542223233,<<<;;2>>>,,;;<,>:>>22>>>>>222222>>>><::::::::::::::::::::::::::::::::::::::::::::::::,,,>>>>>>>>>>>>>",
+"::::::::::::::::>>>>>>>>>>>>>>>>::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::---<<<<<>>>>>>>>>>>>>,,,<>>>22>>1698t*&*t&o##oOO#OOOOOOO@@@OOooO@@OOOOOO   ooooo  OOOOOOOOOOOOOOOOOOoooo@##@%&&#%%%##OOOOOOOOO$$$$$$$$$#96+..;;.;;->,,>-;;;;<<>>>>>;;;;;::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>22222222222222222222222222222222>>>>>>>>>>>>>>>>>>>:::::-.66oo#O###$$##$ut***&&$O#ooooooooooooo ooooooooooOOOO   o##****e8% X169*uuuuuupauuauupkkpu*&+.;:444:-<<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<,<>>>>>,,,<..16OO#&&$&&@@++6661,,<;-;<1669%@$$$9&@OOOOO$O+6..,-42.  O++66+.X.>2,,,<<<<<;;;;;;;;-<1,;..+++@+++.;;;;;1166661.....>>>222332,,<;;;;333,,<--<,>>2222<<>>>>22222>>>><::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>",
+"::::::::::::::::>>>>>>>>>>>>>>>>::::::::33,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::--:<<<<,,,,,,,,,>>>>>,,,>>>>>>>>119yy**e8&OOo#oO#OOOOOOO@@oOOooO@ooOOOOOooooo@oooooOOOOOOOOOOOOOOOOoo@@@@@@@&&%O@OOOOOOO@O@O#$$$&$OO$$$#996+69611;;<11<.;;;;<>>>>>>>;;;;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>22222222222222222222222222222222>>>>>>>>>>>>>>>>>>>::::<<.16++%o#O#$$##$ut****&##%%#ooooooooooo OOOOOOOOOOOOOO   ###**=***#  +69auuuauaauaaauusjja8&+1;::444:<<<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<,,>>>>>2:>,,-;6OOO#&$$&$$@@+666<<<<<<;<1699%$$$9+oOOO$$&O+6.;7>4>1OOOO+66+ X.>4;;------;;;;;;;;;;<<-...++@+++..;;;..++6++++..+1;;>>>>>>,>>>;;;;,,,,;;--;>,,,2>>;;<>>>22222>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>:::::::>>>>>",
+"::::::::::::::::>>>>>>>>>>>>>>>>::::::::33,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,:-----,,,,,,,,>>>>>,,,>>>>>>>;;X68t&&e8&OOO##O#OOOOO@@@@oooooooooooooooooo@@ooooo     OOOOOoOOOOOo@@@%@OOO&&%O@OOOOO@@ooO@###O$OOO$$$$&8899yy966669961;;;<>>>>22>>>>>;>>>>>>>>>>>>>>>>,,,,,,,,>>>>>>>>>>>>>>>>:>>>>>>>>>>>>>>>>>>>>>>>22222222222222222222222222222222>>>>>>>>>>>>>>>>>>>:::::,..66%&+&$$&&$=euu****&#$&&%ooOoooooooooOOOOOOOOOOOOOO   %%%**=**t*8iiihsuwasssuassawasjpu&+..-44444:<<.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<,,>>>>>2-:33--7OOO#%%#$&&&%%996.167,,>-;699%%$$6++oO@$&& +9;<744,+OOOO+6++ X.>4;;;;;----;;;;;;;...--;..+ @+++......+++%%@++++++11;;;;;;;>>>>>>>------;;;>,33,>>;;;<>>>222>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>:::::::::>>>>>",
+"::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>,>>>>>;11X %tOu&%oooooo@@OOOOOO@ooooooooooo@@@oooooooooooo     OOOOOo@oOo@@ooooOOOOOOOOO@&&&#OOoo@%%@OO$$$O#$$$&$$#&&99999999yy71<<>>23>22222>>>>>>>>>>>>>>>>>>,,,,,,,,,,,>>>>>>>>>>>>>,,,,,,,,222>>>>>>>>>>>>>22222222333333332222222222222222>>>>>>>>>>>>>>>>>>>:::::--<.++69&***$$=***ee**&&&&&&#oOOooooo ooOOOooOo@o@oO O   #*8**e***uiihhhsauspussswwupaski8+X.-234444:<<-::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;<<>>>>>>>>>>>><ooo+%&&$&$$#%997.6777:::,779+@@$66++@@%&@++..-:44,+@$OO +++++;>4;;---<,,,<-;<61<666,<-..X++++X..XX.X o@%&&&@O@%&+++++...;;>>2244;;;;;;;;::-:>>,,;;--:>2322>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>",
+"::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>;;;X+%**&*%#ooOOoOOOOOOOOOooooooooooooooooOOOOOooooooo  oooOOOOoooOo@ooOOoOOOOOOOOO@%&%@@#+++%%@OO$$OO$&&$$$#O$$&&&&&&*888f7<;,,>>>2222>22>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,,,,,,,,,,222>>>>>>>>>>>>>22222222333333332222222222222222>>>>>>>>>>>>>>>>>>>::::::<-..699*&&**$$$=*ee*&&&****&#OOOoooooooOOO@%@@@%@O      #=*****=*8uiphjjsusawaaawwuaasky9+.;>44444::<<<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<<>>>>>>>>>>>>>oo++%&&$$$$$&9971677,::>>,76+++@66.+++&9+666;-:44,+O#$O +++++.>4<;---;,,77,,17<<<111,;;..++++....X+ oOOO$$$$OO@$@@@++++611;>>224;;;;;;:::::;;<<<<<;;;>>2>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>",
+"::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>;;1.988$u$o##oOOOOOOOO OOOooooooooooooooooOOOOOOooooooooooOOOOOoooOoooOOOOOOOOOOOOOO@@OO#%%++%%@@O$OOO$&&$$$OOO$$$&&&&&***g97611>>22225522>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,,333,,,,,,,,222>>>>>>>>>>>>>22222222333333332222222222222222>>>>>>>>>>>>>>>>>>>>::::::<..;69y8&*e*===*ee*&$%&****&#OOoooooooOO@%&&&&&#O  OO  %%#8t**==*uapjkbksjsasaaaaaaappy+X.,34444:::<::::::::::::::::::::::::::,::::::,::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<>>>>>>>>>>>>>>XX+699%#$$$&&99767,,,:::>,,<....;..X.+69+661<-:44,.O@&@X+++++.;2<;--;<<,71<<<<;-.;<,,,-...+++..6.XX  OOOOOOOOOOO&&&&&&99661,>222;;;;::::>:;-;;;<1<<;;:>2>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>",
+"::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222>>>>,>;;19988#e##%%#oOOoOOO   OOo     ooooooooooOOOOOOOoooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@%&++@%%@O$$OO$&&&$$OOO#$$&&&&*rr*99996.;,>,22>:>2>>>>>>>>>>>>>>>>2222222222222>>>>>>>,,33,,,,,,,,222>>>>>>>>>>>>>22222222222222222222222222222222>>>>>>>>>>>>>>>>>>>>::::::,<-.<6y88&******eee*&&$$&***&#oooo@@@oOoo#%&*&%%ooo##o%*#o8t&&&**uapjkjjssaaauappaaaau9+.-22442>:<::::::::::::::::::::::::::::,,::::,,::::::::::::::::::::::::::::::::>>>>>>>>::>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>..1666%%$$rr&9777,,::::::>--;;..;.....66.<<<<-::4,. @&+X.66++.;>>>:::>,,;-------..<<,>:;;16+..161.X ooOOOOOO O#$$$$$&&&966611,>2<<>>>>>>><;;;;;;1<<<;;:>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>",
+"::::::::::::::::>>>>>>>>>>>>>>>>:::::::,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,::::::::::::::::::::::::::::::::::::::::<:::::::::::::::2222222222222222>>>>>>;.9cy8*&###%%#OOOoOOOOOOOO              ooOOOOOOOo      ooOOOOOOO  OOOOOOoOOOOOOOOOOOOOOOO@@O@$$$$&*&$$&**$$$###$&&&&&*rr*%*t8961..;,,>->,>>>>>>>>>>>>>>>>2222222222222>>>>>>>>>>>,,,,,,,,222>>>>>>>>>>>>>22222222222222222222222222222222>>>>>>>>>>>>>>>>;>>>:::::::::;--+98&%*****eee***$$=****&#OoO@@@oOooo#&**o%&&%%%%=8# 8t&&&**8uapsapjawuuuwaauuuu*6.;>2442>;;;;>24::::::::::::::::::::::::,::::::,::::::::::::::::::::::::::::::::>>>>>>>>::>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>.-<,166%$$ree97733:::,:-3:--;,<;;;;;;;<,--<<----4>. @96..166++;;>>>>>>>>----;<<<..--:22,<<1...;<611+6&&&&$$OOO#&OO$$$@@@+++6611;>>>>>>>>><;;;...11<<;;:>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>",
+"::::::::::::::::>>>>>>>>>>>>>>>>:::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::<<::::::::::::::2222222222222222>>>>>;;.9xhi8*O=#%@oO OOOOOOOOOO              ooOOOOOOOo        OOOOOO   OOOOOOoOOOOOOOOOOOOOOOO@OO#$$$$&*&$##&&$$$$#$&&&&&&*r*****tiy9+1661<-<,>>>>>>>>222222222222222222222>>>>>>>>>>>,,,,,,,,222>>>>>>>>>>>>>2222222222222222>>>>>>>>22222222>>>>>>>>>>>>>>>>;>>>::::3:::,,,;X%y88**=********====&&**%#ooo@@@ooo #&**#&**&%%%%8# &888**8tuuapppjpuaaa8uiut8*#1;<24443;;.;;>44::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>><<<<<>>>>>-<:2>16+$$ree97734::2,:-3::>2222-;;>,>2>2::::---4>.+%96--1666+1;222>>>>:>>>::;<<<.--:422:;;...-<<11669988t88&#ooOO@@OOOO oo++++.>>22222>><;;;...1<;;;;>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>",
+"::::::::::::::::>>>>>>>>>>>>>>>>:::::,33::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::33,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,33::::::::::::::::::::::::::::::::::::::::<<:::::::::::::42222222222222222>>>>>;;.1czh8*#=%%oOOOOOOOOOOOOO             oooOOOOOOOo        OOOOOO  OOOOOOOOOOOOOOOOOOOOOOOOOOO$$$$$$&$#O##$$$$$$&&*&&&*eerreetuiiiy9997<.-<>>>>>>>>222222222222222222222>>>>>>>>>,,,,,,,,,,222>>>>>>>>>>>>>2222222222222222>>>>>>>>22222222>>>>>>>>>>>>>>>>;>>>::::4::::333X+9yu8********&$$=**&&*8&&%@@o@@o#o #**==*8*=%%#%&% o*88888tuuuauuau*uuuuuu88*% 6<:2442>;...;>44::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>><<<<<<<<>>>::442>1o##$rt9774444:::::::24444;->>2244344::<--4-.+996;>,1+++1;22222>::>>>:----<.-:44422<---;,,>;;;16699888&%%%%%%@OOOOOOOooooo22222222>;<;<.++;;;;;;>,>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>",
+"::::::::::::::::>>>>>>>>>>>>>>>>::::,,33::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::33,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,33::::::::::::::::::::::::::::::::::::::::<<::::::::::::4422222222222222222>>>>;;.XvJc8==$&%oOOOOOOOOOOOOOooo          oooOOOOOOOoooooooo oOOOOOO OooOOOOOOOOOOOOOOOOOOO@#OO$&&$$$r&$##&&&#$%%%&*8***eeeee=eauttihchg91..<>>>>>>>>222222222222222222222>>>>>>,,333,,,,,,,,222>>>>>>>>>>>>>2222222222222222>>>>>>>>22222222>>>>>>>>>>>>>>>>;>>>::::-:432:::XX+8i8=*e*****$##=**&&*t&&&%@o@@o##o%**=*8**==&%&&%  &8*&*****wwu=u**auu******% 7,:2322>;...;>44::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>><<;;;;<<<<>:4444>. OO$&t9773444:::,-::24444,>>>>44444::<<<<4-.6961>3>..++1;22222>::2,>>>:>>..->44443,<<<,772>;-XX.+999&%9989&&%@OOOOOOOOOOO22222222>;<;.+++...-;;,3>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>",
+"::::::::::::::::>>>,3333>>>>>>>>33333333>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222222222222222222222>>;XhKHi*t=i8%%+oO@OOOOOOOOoo            oooo   ooooooooooooooooOOOOOOOOOOOooooOOOOOOOOO$#OOO&*&&&&***=====$$$$&&==*=**ww*=*wuiihjparet+.24>>>22222222222222222222222222222>>>>>>>>>>>>>222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::4-69&*e*=*888***=***8utt***%##%=**==%%*8********&8&  %8&88*8t888uwwuaauuu*##$&#o<--,32::<<<<:444::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>,>>-::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>,166++OO61;;522444444222,>:->,>-:;;;;;;;:423332>>><;;;<<<<;..;..---:>24432::234:37,..66632523>-;766+@&ee*&&&&OO ooooo###OOo+1-,766996+..222>>:;;71-.....>222::>222222222>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+"::::::::::::::::>>>>,333>>>>>>>>33333333>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::3,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222222222>;7hzHxt#=8&%%@oOOOOOOOOOO             oooo    ooooo   ooooooooOOOOOOOOOOOooooOOOOO@OO#$OOOO&&&&&*&&======$$$$$&==*==*wuw**wuiihjpaeet%.24>>>22222222222222222222222222222>>>>>>>>>>>>>222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::4:69&**=$=88=%%%=***8ut8***%##%=**8****888******&8&o %88888tt88uwwwasspaw*=$&&%o<--,3:::<<<<:444::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>,>>-::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>22>>,;..++9t99611;;5332>>;;1-;<<,,,>---;;;;;>>2>22>,,,,<;;<<<;--;;;<;;;>>2243:::232:-<-..666::::>>;.166%&*tet8**&#Oo+%%%##$$OO+61;;,1666+...222>>:;;11,<;...>222>:>222222222>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+"::::::::::::::::>>>>,333>>>>>>>>33333333>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::333,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222222222>;;;6ici%u8*%oo@@OOOOOOOOO    ooo oooooooo     ooooo    oooooooO  OOOOOOOOooooOOOOOOO@&&&#$$&*&&&*********&&&$&&******uuuwwuuiihjpueet&124>>>22222222222222222222222222222>>>>>>>>>>>>>222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::42<+&*$=$=**=%##%=***8t8***=%%&=*8tt8***t8**==**&&%#  %888888*8uwwwuappa****&&&&<<-:2:::<--<::44::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>2222>--;666998*&96+..X.166+XXX.;<----<>><;;;;2>>:>>,,,,,,;;;;2>>::;;<;;<>>222::::233:-:<.<699>>>>;;;.X.+&&&&&8***&$Oo+%%%oO#$&%+61,>-......--22>>>>;;;177<.;<>222>:>2>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+"::::::::::::::::>>>>>,,3>>>>>>>>,,,,,,,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::,::::::::::::::::3,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222222222>>11XX8ht*88=o @%@OOOOOOOOo   ooo oooooo       oooo    ooooooooOO OOOOOOOOooOOOOOOOOOO$&&&&&**&&&*********&&*********uuuuwwuuiipppueet96>4>>>22222222222222222222222222222>>>>>>>>>>>>>222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::43-.&*$*==*8*%%=%====*88=***===*=*8t8***88**==**%%%%o #888888tuuquw*waau==***&&&1<-:2:::<--<::44::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>,>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>22222-;<666++&&&&&&++ +&tyt&O666661<,,,,,>>>>,,<;;<,,,,<;;;;;44445:::;;;;::>>::::333,:,,-<777<,,;-...X++%@OO$$$$&&$#%%%%%+oOO&&+..;>--....-->>>>>>><<-,77<;<1>,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+":::::::::::::::,>>>>>>>,>>>>>>>>,,,,,,,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::,,3:::::::::::::::::::::,,3:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222222222>>>11X+hh%qu*o O%@OOOOOOOOooo oo  ooooo       oooo  ooooo  ooooOOOOOOOOOOOoooOOOOO@OOOOOO@&&**************&********8uaauu*wwquiiuuue*e86<:>>>22222222222222222222222222222>>>>>>>>>>>>>222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::43.X&*&*===**==***=%%=**====****%=******88***===&%&8&o%&u8**8uuuuauwupaw==&&&&&&1<-:2:::<---<::4::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>3>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>,--...66OOO$&&&&&&&*eeer996666<<<,,>>>>>;;;;;;--<<;;--;;44444423:;;-----,::,3333::<--<11-<<-.;16699%OOO$##$&*&&&999999%O@++..->,,,;;<233>>>>>><<;<,<<;<<,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+":::::::::::::,,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::,333::::::::::::::::::::,333:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,33333333::::::::::::::::::::::::::::::::::::::::::::::::::::::::222222222222222232222222-X;XX9ch*u8%oOOOOOOOOOOOooo oo  ooooo       oooo  ooooo ooo oOOOOOOOOOOOOoooOOOOOOOOOOO#&&&***tt********&&*******uuaauu*wwquuuuuue*&96;->>>22222222222222222222222222222>>>>>>>>>>>>>222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::42-X+&**=$%**&=*t8*=%===%%=========**888*****===&%&88%#%t8*=*8*=*uuuapu==$$$&*&%6<-:::::<---<:::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>3>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;:>>>>>>::--..<1OOoo++++++&&&&&&&+ ++...;;<:>>>>..------<;;;;;;<44444237><;;;---,<:,333,,:-------<<-<799999%OOO@##$&&&&&9999999+ o+6;;;>,,>:>444>>>>>>,,<;--;<<<,,,,,,,;<<<<<<<<>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+":::::::::::::,33>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::,333:::::::::::::::::::::,,3:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,3333333333::::::::::::::::::::::::::::::::::::::::::::::::::::::::222222222222222233222222711;.1vh*qu*##OOOOOOOOOOooo oooooooooo  OOOOOOOOOOOOOOOOooo   OOOOOOOOOOOOOOOOOOOOOOOO#&&&&**eet********&&&******wuuuuuwwwuuiuuuee*&96.;>>>22222222222222222222222222222>>>>>>>>>>>>>222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::4:-.X%**$##**=&*88*=%==============**888****====&%%&8&# 888==**==*wuuu*#$$&***&%6<-::4:::----<::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>3>>:>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<>>>>2225:,,,;......111.669999&&9++66616;<<<<,,,<<;;.;;<<<<<<,,,>333>>,7,,,,,>>><<<,,3,:,,::::<<<,<-7fgg996%++o@#OO#$$&99966666++o+66;.;;;->2444>>>>>>>,,;--;<,,,<;<,,<;;;;;;;;;>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+"::::::::::::,,33>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::,3333::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,33,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::222222222222222223322222-3;;1.;gquu*####OOOOOOOOoo  ooooooooooooOOOOOOOOOOOOOOOo@oo    OOOOOOOOOOOOOOOOOOOO#@OO#************====**&==**t**uuuuuuwwwuu88t*te&96.,>>>22222222222222222222222222222>>>>>>>>>>>>>222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::3:<.X+*&##$**=%&%&&%&=*=***=======***88***====***&%&88% *8t***tuuuqquu=##&****&%6<-::4:::<---<::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>3>>:>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,>>>22222>:--<,,>:>>>>--;,11666966696116111<1111661<<117<<<,,,331661;-;,,,,,,,,2<<-<,,:-::::,::,:,--7fgg76999969%OOO#$&y996....19+ ++..;<<,33734>>>>>>>,-<<<;;<,,<;<,,<;;;;;;;;;>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+"3333333333333333,,,,,,,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::,,33::::::::::::::::::::,,33::::,3333333333333,,::::::::::::::::::::::::::::::::::::::::,,33::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222>222222222>>>,11j=u**####OO@@OO@ooooooooooooooooooOOOOo@o@@o  Oo%oo  O  OOOOOOOO OOOOOOOOOOOO@@@&&&***************=$$$=*uuuuuuuupauuuiutut&96..;>>>22>>>22222222222222222222233333322>>>>>>>>>>>>>>>>222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::7--1.68&O$**=***8*&&=*********=====***888*==***=&#o%*8&%%8ut8uuujjpu==*$#=*&&**&1;-,34:2:<---<::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>,,,>>>>>>>>::::::::::::::::::::::::::::::::::::::::::,,::::::::::::::::::::::::::::::::::::<>>>>222222>>>>>444444442>>-;;;;...<116616677666677667779777,;<,XXX.699977,-:22:<---<<-----:::22:::::,776661..69%%@@@%&996<-<-..+++++++X.;->773:,,,>>>>><<<<<;;;,<<;;;<<,,<;;;;;>>>>>>>>>>>::>>>::::::::::::::::::::::::::::::::",
+"3333333333333333,,,,,,,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,>>>>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::,33:::::::::::::::::::::,33:::::,333333333333,::::::::::::::::::::::::::::::::::::::::::,33::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222222>>>>,,pp88u=###OO@@OOOooooOOOOoooOOOOOOOOOOOOOOOOOOOOOooo  O  oOOOOOOOOOOOOOOOOOOOOO@@$$&*******8*******=$=****quuuuuupauuaauut8996..<>>>22>>>22222222222222222222233333222>>>>>>>>>>>>>>>>222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::4-:,19h8O$==&&*****&==********=====******===***=#o#%&8*&*8t88uu*uiau=#=#$=*&***&6.-<,::::<---<::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>,,>>>>>>>>::::::::::::::::::::::::::::::::::::::::::,,::::::::::::::::::::::::::::::::::::>>>>>>2222222>>>4444444442>>>-;;--;;;<<<;;16+++.66;...;<6<;<<;-;  ++66661<-:2324,:-:,,,:::::::::444::::,;<<;..1699&%@%%66<--<<--++++o++X..-;,3,-,>>>>>>:>><<<<<<;;;;;<<,,,<;;;;;>>>>>>>>>>>::>>>::::::::::::::::::::::::::::::::",
+",,,,,,,,33333,,,,,,,,,,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::,,,:::::::::::::::::::::,,,:::::,,333333,,,,,,::::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::222222222222222222222222222>>>2,*k88u8###OOOOO OooooooooooOOOooo@@OOOOOOOOOOOOOOoooo OOOOOOOOOOOOOOOOOOOOOOOo@@%##&******8uq*****=$$*8uuaaaapppppauuaaut89996.-,>>2222>>2222222222222222222223333222>>>>>>>>>>>>>>>>>>22>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::423-;gh&#=****88****&&=***888*==========*==****=O#%&&*8888***t*=%=u8%###=****8*%6..-:4:::<<-<<::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>,>>>>>>>>::::::::::::::::::::::::::::::::::::::::::,,::::::::::::::::::::::::::::::::::::>>>>>>>222222>>>22222222>>>-;;;;::-------....XXX.<6677<.;-.;,<--O@&9+...--->3334:---:,<<:::,2:::4444::----;;;;;;999yy966<--::--<X+++ooo++1;;;<;;>>>>:::->>>>>>>>---;;<,,,,<;;;;;>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+"::::::::333,,,,:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::,:::::::::::::::::::::::,:::::::,333,,,,:,::::::::::::::::::::::::::::::::::::::::::::::,::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222222>>>>>2 ci888==#OOOOO OooooooooOO Ooo%&%#@OOOOOOOO@%%@O ooo OOoOOOOO@@#@####OOOOOOoo@%&#$&*****tuuuuqwq*=$=*uuupaappppaaauuuutt8966<-;3>>2222>>222222222222222222222333222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::433--99%&*r***88&&**&===**88**=======%%%===*8**=#$&&**888*==*t*=##*8=#$#***&*t*%6+..:24:::<<<:::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::,,::::::::::::::::::::::::::::::::::::>>>>>>>>222>2>>>;;;<<<<<;;;;;;;;>2>>>>--;;...XXX.<77ff77;;;<;;;<999+.X.;<,,33325::::-:---::::2::444442:::,<,,,>><79ggy661,:2::-:.16++o+++1,,<;;;>>:::--->>>>>>>>;;;;;<<,<<<;;;;;>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+"::::::::333,,:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::,:::::::333,,::::::::::::::::::,:::::::,:::::::,,::::::::::::::::::::::::::::::::::::::,::::::::::::::::::::::::::::::::2222222222222222222222>>>>>>>>>2X8li8uu8#OOOOOOoooooooooooOoo%&&%#OOOOOOOOO@%&%% ooo OOooO@@##%%&*e*&#@@OO@@@@%&%&*88***8uaauqqq*===**uauuuuuuuquuuutee8961;;;>>>222222>22222222222222222222233322>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::4:-79y&==$$&&&&&%&&&==8****=======%%%%===*8*==&&&*8888***=****%o%**&=$***&*8*&96..<,2:::<<::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::,,::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>;;;;;;;;;;;;;;;;>>>>>>>>,,<;....<;-;1777-<<;.-<7996.X.;,,,,,22>>222::--<---:::::44:::,,,<---:>>:-:7ff9717324>--,;;1+++++.113,<;.>>:::--:>>>>>>>>,<<;;;<<<<<<<;;;>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+"::::::::33,,::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::3,,:::::33,,:::::::::::::::::,,,:::::,,,:::::,,,,,,::::::::::::::::::::::::::::::::::,,,::::::::::::::::,,,,,,,,::::::::222222222222222222222>>>>>>>>>,,1.ch88i8##oooOo@OOOOOOOOOOOOO##%#@OOOOO@OOOO%&&&oooo OOOoOOOOOO@&*t*&OOOO@%%%%%%&&**88*=*uaau8**==***8uuuuwwwqqqwwwwte**%6.->22222222222222222222222222222222333>>>>>>>>>>>>>>>>22>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::44>;6y**=$$&&&&%#%&&==***====*===%%%%%==****==&&&*888*****==**8##****=***&*tt*996<<:2:::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::,,::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>><<;;;;--;;<>>>>>---;:>>222>:;<;<<;---,,<-<,<-<7761.--,,32>::-;<,44:::---<<::::22:::---<<<----:>>4477777773:::>>,25;..+X..133,,;.>>>>::>:>>>>>>>>,,<;--;;;;<<<<;->>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+"::::::::33,,::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:>>>>>>:>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::33,:::::33,,:::::::::::::::::,33:::::,33:::::,3333,::::::::::::::::::::::::::::::::::,33::::::::::::::::,,,,,,,,::::::::222222222222222222222>>,>>::>>>,1X9ci8uu=###ooooOOOOOOOOOOO###OOOOOOOOOOOOOO@&&*%@oo OOOoOOOOOOO$&&&$OOOO@&&&%%&&&&*88*==8aau8**==**uuuuaauuqquuwwwwe*&%+.-->22222233222222222222222222222222333>>>>>>>>>>>>>>>>222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::44>-198e*$$&*&&%%%%&==***========%%%==******=%$&***&*******==*8##88**==****tt*9996<:2::::::::4::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::,,::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>;;;;;;<>>>224444---;;:>2555444>>->,,,,--,,,<<777:::>23245>>--;;<4444::,,7,,:::22::<<<--.;-<<;<>,447777773::522>>445;.XX.;;,3,,<;,>>>>>>>>>>>>>>>::---:>>-->>>>:->>>>>>>>,>>>>>>,::::::::::::::::::::::::::::::::",
+"::::::::33,:::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:>>>>>>:>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::333,::::33,:::::::::::::::::,,33::::,,33::::,,3333,,::::::::::::::::::::::::::::::::,,33::::::::::::::::,,,,,,,,::::::::222222222222222222222>,,>::::>>,..1lhiii*=##o ooOOOOOOOOOOO###OOOOOOOOOOOOOOO%&8&%oo OOO%%%%#@@@$$$$$@O  O&&&&&*&%#&88*==qapi8*=$==*uauuaaauwwquuuuwe&OoX.;>222222233222222222222222222222222333>>>>>>>>>>>>>>>>222>>>>>>>>>>>>>>>>>>>>>>>>>>>>:>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::4443>198e&$$&&%&&&%##&==*****==========*****==%&*8*%#%&********8o%8*==*$*tttutt9996<:::::::::44::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::,,::::::::::::::::::::::::::::::::::::>>>>>>><,,,>>:>>--;<>>,224444444;;;;;>>2:4444444:>>---,;,,--<6<.44444444423,<;;;4337777777,,::22-<,,,<<<..;<;--;4477777372:233>-442;.XX.;;::>,<;,,,>>>>>>>>>>>>>----:>,,--:>>>:->>>>>>>>,>>>>>>,::::::::::::::::::::::::::::::::",
+">>>>>>>>>>>>>>>>;;;;;;;;<<<<<<<<::::::::::::::::333,,:::::::::::::::::::33,,::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222222222222-,.yliuaa*==oo@  O@OOOOO OOoOoo+ ##oooooOOOOOO&*&&&@   O%%%%&&@O#&%OOoO OO#%&&&&*&*8t88**8tuaau8=8888q8=ipu*ttutuee8991;;;;;<:::222222222222222233322222>>>22222333,,>>>>>>>>>>>>>>>>>>>>>>>>>>>2222222222222>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::444:,1198**=**8q*=%%====**88*****=%%===*%%%%===*=*8*% %888*****u9+ +&*&&&***tt88&*9+.;,::,,,;;;,..;>24423<--;>22::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::::::::::::::>>>>>>>>,,>>>>>>>>>>>>>>>>>>>:::444444:::::<<..;;:444444,<<..,,7999999%++ XXX61666<..-<::44444466%@++<3444:;.::::::::::::::::<<<<<>>>>>>>>222>>>:>>,3>>>>>,,,2222>::::>>>>>>:::::::::::::::::22>>>>>>22222222",
+">>>>>>>>>>>>>>>>;;;;;;;;<<<<<<<<::::::::::::::::33,,,:::::::::::::::::::33,:::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222222222222222222222222222222227-XXyhuupu*=oo+oOOO  OOOOOOooooo ###ooooOOOOOO$&&&@@OOOO@@@@@@OO&*&#OOO OO#%&&&&&&*8t8***88upauu*8888uq*ua*=**ttee*891;;;;;;;:::222222222222222233322222>>>22222333,,>>>>>>>>>>>>>>>>>>>>>>>>>>>2222222222222>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::4342>X.98*****8q8*===**=8**=====*=%%===*======**==**%#%888*8**uu9XX+&&&*==**tt8*&*9+.;,:::,,;;;>.;;>2442>;<11>5>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::::::::::::::>>>>>>>>,,>>>>>>>>>>>>>>>>>>>:::444444::::::<;;;;:444444:--<<,,7999yyy899966+666661..-<:::4444376&%@+<4444>;.::::::::::::::::<<<<<>>>>>>>>222>>>:>>,3>>>>>,,,2222>:::>>>>>>>:::::::::::::::::>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>;;;;;<<<<<<<<<<<::::::::::::::::3,,,::::::::::::::::::::,,,:::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222222222222222222222222222222223-<X9chaaaq%#oo+OOO OOO OOOOooooo#%%####OOOOOO#$&%OOO@@OOO@OOoo%88*#ooo oo#%&&&&&&*8t8***88uppuu8**8uuqq8u==**ttr**96.;>>>;;<:::222222222222222233322222>>>2222233,,,,>>>>>>>>>>>>>>>>>>>>>>>>>>22222222222222>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::433:;X+8******qut8*=******===*===%#%==========**==**=%=88888**uu6+ %*&&*==***88*&*9+.;>:::,<;;;>-<::4442;-177;->::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::244444:::::::;;>>:44444::--<<<-6799hiyy888899699961..--<:::::4379&&%6<:444>;.::::::::::::::::<<<<<>>>>>>>>>22>>>>>>>,>>>>>>>>2222>:::>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>2",
+">>>>>>>>>>>>>>>>;;;<<<<,,,,,,,,,::::::::::::::::,,,:::::::::::::::::::::,:::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222222222222447;.9qqiji*=% oooooo#oOOOooOOOOo%%%%&&%oOOOOOOO@@@@@@@OOo%%oo%*88&o oo oo#%&*&&&=*tt8**88*uppu88**ququa*u==**te*&&%1;;2>>><<:::222222222222222233322222>>>22222,,,,,,,,,,>>>>>>22>>>>>>>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::-3:-199y*****qqq8******====8qu8*=%#%%%%========*=====*88*88u**wu9++&8&$&******8**t8+.;>:::::<;>><<:4442,<.1991.1::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::2:444::::::::>244444444:::::..6998iy88tyiy8899996..-<<<<<:<<43799&&6<<:44>;;::::::::::::::::<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>22222>>>2>>>::>>::::::::::::::::>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>;;;<<,,,,,,,,,,,::::::::::::::::,,::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>,>>>>>>>,::::::::3,,::::::::::::::::::::::::::::::::::::::::::::,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222222222222444>XXhjqjjii8%#%%#o o## O@@OO@%#%&&&&*&%%ooOOOOO%&&%@oo%&&&#o#*t*&ooooo##%&**&&**8tt88888*8aau88*8uuqup*q=*u****$++1;>2>>><<:::222222222222222233322222>>>22222,,,,,,,,,,,>>>>>222>>>>>>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::-3;.9hhu8*=*wuuq&&*****====8uiuu*=%%=%%=========**==*888**8u***u8% %8=##=******8*t8+.;>>:::-::::::44442<;X+9y9..::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-::::::44:::::::44444442::224:::..99yiit8uuiiiiytt996..<<<<<<;;;:769&*&+1<:4:>;;::::::::::::::::<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>22222222>>>>>>>>::::::::::::::::<<<>>>>>>>>>>444",
+">>>>>>>>>>>>>>>>;;<<,,,,,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>,,,>>>>>,,,::::::::333,:::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222222222222222222244-31.hxihjpaq=%#=**=%#  oOOOO@@#&&&&***&&%ooOooO%&&&##%8***&##%t8*%####&&*8**&&**8tt8*88u88aaq8q8quuqup=w=*u**=&o .1>>>2>,<<:::22222222>>>>>>>>33322222>>>22222>>,,,,333,,,>>>>332>>>>>>>>>>>>>22222222>>222222>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::-,-1ghi88***uuw*&**888**8*=*8uuiu*=====*========***=*888**8u***uy% %*=$#=*****88et8+.;>>::-:::::444444,<.X6yh9+X::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-<::::::::::::::444423,,--;>2244XX9iiuiquuiiiuq8tt896.-<::::;;;.-699*8&%61,::>;;::::::::::::::::<<<<<>>>>>>>>>>>>>>>>>>:>>>>>>>>2222222>>>>,,>>>::::::::::::::::;;<<<>>>>>222222",
+">>>>>>>>>>>>>>>>;;<<,,,,,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>,33>>>>>,33::::::::333,:::::::::::::::::::::::::::::::::::::::::,33::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222222222222222222244431X1hjhppaw*=#=quiu*#%o   OOO#$&&&**&*&%%ooooOo%%%%&&t**8*&#%88*=&&==*8ut8***88tt8**88888iiqqiqquuuuaqu=wu*=$+ X.;>2222,<<,::22222222>>>>>>>>33322222>>>22222>>>,,33333,,,>>>332>>>>>>>>>>>>>22222222>>>22222>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::,-.9hh8*8www8***********88*=*8uiu8*====*=========**********uwwuui*o%*==*==****8ueu8+X;>>2:-:::::444442,;1+%8y9+X::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::::::::::::::>>>>>:>>>>>>:>>>>>>>>>>>>>>>>-<<:::::::::::::444>,,66611;;>>2 +8iquiuuuuuuqqutt*961<:::::;;;.<799888%66<:->>>::::::::::::::::<<<<<>>>>>>>>>>>>>>,>>::>>>>>:::2>>>>>>>:>,,,,<-::::::::::::::::;;;;<<>>>>222222",
+">>>>>>>>>>>>>>>>;;<,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>,,33>>>>,,33::::::::3333,:::::::::::::::::::::::::::::::::::::::,,33::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222222222222443>;19Hzjjjaquuq**qipai8&o O@O #$&&&&&&&&%%%oo OOOO#&&=t**tu8****=****88uiu8***888t8**8*888iiuuauqqiauqaawuu==#+XX.>22222,,<,>>22222222>>>>>>>>33322222>>>22222>>>,,333333,,>>>332>>>>>>>>>>>>>22222222>>>22222>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::1X.hki*u*uuu****88**&&*******8uiu8*==%==*========******=***euuuai8##%#=*==*****uwu8%X;>>2:-::3::44444,<.++%%%%+ ::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::::::::::::::>>>>>:>>>>>>:>>>>>>>>>>>>>>>>-<<:::::::::::::44>;;1669961.;;>%=uiuuaauuuuuuuatt8967:4444:>;;;<7988u8&%61;-;>5::::::::::::::::<<<<<>>>>>>>>>>>>>>,>>::>>>>>:::::::::::::,3,,;-::::::::::::::::;;;;;<>>>2222222",
+":>>,,>>>>>>>>>>>,<;----;<<<<<<<<:::::::::::::::::::::::::::::::::::::,,,::::::::::::::::33,:::,3>>>>>>>>>>>,,333::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::33,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222222222222222222222222333333333423;.9cJkppsauuuaaauapjp8&ooO O$***&&&&&%ooooooOOO#&&==uuut****8***8tuu*888***8uttt8**8quuuuuuuuiiiapauuapau*==+.X;>24222,,,,,,22222222222222222222222222222222,,,,,,,,,,,,,,,,>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::22222;1Xhxae*ww8******8t8*********8uiau8*===***8*=%%=uu*****=tuau****iq8=**===****t8***891;3:::,:::::34--,;.+8%%%o++X::::::::::::::::::::::::3,::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>,,3>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<:::22222::--::><16998yhh9XX16*8ququaaaaaaaaaut8&6973:44442--;.69y8q8889961,>;::::::::::::::::<<<<<>>>>>>>>:::>>>>>>>>>>>>>>>>>>>>>>>:,>>,,,,-::::::::::::::::;;;;;<<>>>>>2222",
+":>>>>>>>>>>>>>>>,<;;--;;<<<<<<<<:::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::,3333,:>>>>>>>>>>>,,333::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::33,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222222222223333333332,1;XX6HBnjasspppppaaaapi8o %O ##$$&&&&&%ooooooOOO#$&==*******88**8tuuu*888**8tu888u8888uuuuuiiqquuaaiqquaau**=+..;>4422>,,,,,222222222222222222222222222222222,,,,,,,,,,,,,,,,>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::222221X+cjwuuuuuq8***8t888*88*88**8uiiuuq8**8**8**=**8**=****uu**===*iuq8**===****88**ti91;2>:::<<:::-33,1.X%i8*&o++X::::::::::::::::::::::::3,::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<::::2222:::::<<;169yiiuahi999haaaaaaaaaaauuuaai8%+1,2444444::,<69yuqwq889971,;::::::::::::::::<<<<<>>>>>>>>>::>>>>>>>>>>>>>>>>>>>>>>::---;<;--::::::::::::::::;;;<<<<>>>>>2222",
+">>>>>>>>>>>>>>>>,,<;--;;<<<<<<<<:::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::33333:>>>>>>>>>>>>,,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222233333333,,,,1.XX9xJxpssppjkjaasjpjj8ooOOOOOO#&&&%%oooOOOOOO#$&&=&=*****88888tuuu888888tuu8*8uu888uuaaiii8qquiiq**wqu8**=6..;22432,,,,,2222222222222222222222222222222222,,,,,,,,,,,,,,,,>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::222226Xhzpupsaaiuq8eet88888tu8888*8uauuuuuq888888**8uu88****=**======*8uu8===******ee*8y91;>22:--<<::<,;...%8iuu*@++.::::::::::::::::::::::::3,::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::22:-----<<..+9yiiuupjpiihhsppapaauaaaaaauui89+.;>444444::3669iiqwquuy996;;::::::::::::::::<<<<<>>>>>>>>>>:>>>>>>>>>>>>>>>>>>>>>:::-,,,,<;-::::::::::::::::<<<<<>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>,,<;;;;<<<<<<<<<:::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::333333>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222233333333,,,;;11.X9xzkjiqpsjjpaaspuaa*  %oo  #&&%%%ooOOOOOO##&&**********8888tuuu88ttttuuu888uuq8uuiiuuuuqqquiiq***8***==66.;22432,,,,,2222222222222222222222222222222222,,,,,,,,,,,,,,,,>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::22222XXxBsuuauiiq88eet888uiiiuuqqqqiauuuuuq88q88***8qiq8***=====****=%*8u8******&&*ee**96;;32::--<<--1.XX698iuuu*%++1::::::::::::::::::::::::3,::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::2222:---<<<<++68iiuuapjjpaapppppppaauaappaiuiu89961-3::44::3669iauqqw888961;::::::::::::::::<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::,,773,,,::::::::::::::::>>>>>>>><<<<<<;;",
+",>>>>>>>>>>>>>>>,,<<;;<<<<<<<<<<:::::::::::::::::::::::::::::::::::::,,,::::::::::::::,,:::,3333>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222233333333111--;;;.X6icxkkpuqajjsus0 *u* ooo  o%&%##OOOOOO##$$&&&*ttt******888ttuu88ttuuuu8uu88quuuuiuuuuuuuuiiuq*********96;;>5422,,,,,2222222222222222222222222222222222,,,,,,,,,,,,,,,,>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::22222X9KBkdwwwqq88tteiuuuiaiiiiiuuiapiuuuuu88888***8888==***8==**8888=*8tt8*****&&**et&+1;-2::--<<<;;XX+9iiqquuu*%+.1::::::::::::::::::::::::3,::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>222224223,<<,666+%8iiauuapsjspppppppppaauappaaiiiiiiy961,<:3333769yhpiquww889611::::::::::::::::<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::;-,33,<<<::::::::::::::::>>>>>>>>;;;;;;<<",
+"3,>>>>>>>>>>>>>>,,,<<<<<<<<<<<<<:::::::::::::::::::::::::::::::::::::,,,::::::::::::::::,::::,33>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222233333333;,3,>>:-;.XX9hxnnkjsjjjjjw=%qi%      #%%oO##OOO@$$$$$$&&tt*****t**888tuu88tuuuuu8uuu8quuuuuiuuiaiuuuiu*=********96<-::522,,,,22222222222222222222222222222222222,,,,,,,,,,,,,,,,>>>>>>>>>>>>>>>>>>>>>>>>22222222>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::22222;cTnkswwqqiiiiuupaaappaiaaaiiaaaaiuuiuuuuuuuuuuu88888*8uuuuu88ui****8**&&**&$&**y%+.;>2::-<<;117+98iiiqauau&%1.-::::::::::::::::::::::::3,::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>444444423:-<1666o%8iaaaasssjspppppppppppaaaiuuiapaiiii991<<3777769ghiiaauwe89+11::::::::::::::::<<<<<>>>,>>2>>>>>>>>>>>>>>>>>>>>>>:::::;-;<,,<<,::::::::::::::::222>>>>>;;;<<<<1",
+"3,>>::>>>>>>>>>>,,,<<<<,<<<<<<<<:::::::::::::::::::::::::::::::::::::,,,::::::::,:::::::::::::::,,,,,,,,>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222233333333;>233223277;XX9vVVCVkpskjjsqqp8#oo   o##OO#$###$$&&$$$$&&&&*****==*888uu88uuuuuuuuuquuuuuuiiiuuiiu8uu8*=********66.--::2,,,,,22222222222222222222222222222222222,,,,,,,,,,,,,,,,>>>>>>>>>>>>>>>>>>>>>>>>22222222>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::22222XcIkkawwaihhhpaujpaaaaaapaaaaaaapaaaaaiiuuiaaiuu88uiu88uaaiuu8ui*****&$#&&&&$$&**+X.;>2:::<;;19fyiuqiuasua*%%6;-::::::::::::::::::::::::3,::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>44444442:--<676698yiipppjjjssaaappppppppiiiiqquiaaaaiiiy967777776yhhiaaaauut8+11::::::::::::::::<<<<<>>>,,>22>>>>>>>>>>>>>>>>>>>>:::::;;,<;<,311::::::::::::::::2222>>><;<<<<166",
+"33>>::>>>>>>>>>>,,,<<<<,<<<<<<<<:::::::::::::::::::::::::::::::::::::,,,::::::::3,,::::::::33::-33333333>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222222222222222222222222333333337>>224:44-511XX1 aVCnkjjkjjpjka=%%%o oooOO#$$$$$$&&$##$$O#$&&&&&%=*8888u8uuuuuuuuuuquiuquuiiuuqqiu8uu8*=q8*****&61.--:43,,,,,22222222222222222222222222222222222,,,,,,,,,,,,,,,,>>>>>>>>>>>>>>>>>>>>>>>>22222222>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::22222XcTVkuauphcchhaupaaiiappaaaaaaaijpaapauuuuuiuu8*%%8iu88ituuuu888******&$$&&$$$&&@ X.;>32:,<;.6fhiu8qapaauu= %6;,::::::::::::::::::::::::3,::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>,,3>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>44444442,<<67999hhiihhjsjjsssppppaapsjpa8qiii888aapppaihyyyfff776ghhiapasaaay967::::::::::::::::<<<<<>>>,,,22>>>>>>>>>>>>>>>>>>>::::::;;<---,311::::::::::::::::44222>><<,,16667",
+">,,,,>>>>>>>>,,,,>>::>>,>>>>>>>>::::,33,::::::::::::::::::::::::33,,>>>>>>>,3333::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222,,,,,,,,3333333322222>>>>>>>>>>>1X6cLKzjjmsmmskauwuu% o&%#*t*et*@$$#OO#&o##o#%%#==*8uuuiuuuuuuiauuuuuuuuuuquuuuutuuu888***==*e*$91-;,;-,>>222222222222222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>22222>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>,>>>>>330j!kwkdpjjkkjpaajpaaapppiaaaaaapuuaaauuaquaai8==qiauqqqqqqiaau*=*****$$$$&*997712:::<<::>,;X08qwpiiaspawuu%6613-::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222:::>>>>>>>>222225>2,>--;;X+8iuuappppppssjsssjsssspppjjpuuuuaauuwiahjjppaaapi8%+6uippaiiiaipii8o 444443:-<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;;<>>22224::-<,,::::::::::::::::22:::::<<<<<;...",
+">,,,,>>>>>>>>,,,,>>::>>,>>>>>>>>::::,33,::::::,,::::::::::::::::33,>>>>>>>>>,333::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222,,,,,,,,3333333322222>>>>>>>>>>>X1;XgHHjjjsmbbVksuupa8% ##&etuuu$$$#OO####o  #=*8888uuuuuuuuuuiiuuuuuuuuuuuuuuuuett888*=*==*ete&f7;<,-->>>>22222222222222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>22222>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>,3XxTkspjaaknnnbksjppppppapaaaiiiaaiaaau88iiiiq88qiapiuuuqqquiiu*==****&$$&&&6611;2::::<::>,;X08uuaiiasaauau%66<,-::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222:::::>>>22222222>>2>>:-<1.+9iaapppppppssjjsssssssppssjspaauaaaaaiiiiiaauaaphi89&hppppaaaaipiu8oo4444:::-<::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;;<>>2222>::-<,,::::::::::::::::22:::::<7777<<..",
+">,,,,>>>>>>>>,,,,>>::>>,::::::::::::,33,:::::,33::::::::::::::::,,,>>>>>>>>>,333::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222,,,,,,,,33333,,,222222>>>>>>>>>>.11X1hnJnbkmbbbVVkpjjat&###$*tee&$%###Ooo##o#&8ut8888u88uuuuuuiiuuuuuuuuuuuuuuuwett88*====*etue&f7,,,-->>>>22222222222222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>22222>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>,3Xx!nkdkppknVVVbjjjjppsppjppaaaiiaaappau8aiiuqquiapaiqquuiuiaiu*===***&$$8&+XX.;;22:::<:::>;;68iaiiiaaaaaaq%66.<-::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222::::::::222444442222::::<..9ihpsppsssjjjjjssssssssssssjjpaaaappappaaaaaasaapjkkkjpaaapaaaaji8*oo:44::::,:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;;<>>>222>:::<<,::::::::::::::::22:::::<7777,<;.",
+">,,,,>>>>>>>>,,,>>>>>>>>>>>>>>::::::,33,:::::,,,::::::::::::::::,>>>>>>>>>>>>,,3::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222,,,,,,,,333,,,,>22222222222222221.;1;X8zPbkskkjkCbjpauut**##tt=*&%%%&&#OO####%=*88888uu8uuuuuuuuuuuuuuw8uuuuuuuuuut8*==****euu*&77<,,;->>>>22222222222222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>22222>>>22222222>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>,,X9YBkkjsskknVCVbkkjppjjjjspppaaippppjjaiiiuiuuiippauqquipaiiu8*=*==$%&&9&+.X.;;;22:::::::>>;69iiiqqaauuau8++6.<-::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222::::::::4444444444444::,-.68hjjjsssjjjjjjjjjjssspssssjjjjspppppasssssssskspppjkkjpaaasspsaji88oo,,,,:::,:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;;<>>>222>>>:<<<::::::::::::::::2:::::::7777<<<<",
+">,,,,>>>>>>>>,,,>>>>>>>>,,,>>>>>::::,33,3,,,::::::::::::::::::::>>>>>>>>>>>>>>>,::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,::::::::::::::::2222222222222222,,,,,,,,333,,>>>22222222222222221;-,1.19PnksbbkVbjspu8*=t8##t*$=&%%&&&&#o#%#ooo#88888uuuuuuuuuuuuuuuuuuwuuuuuuuuuuu8*==*uueeet*%7,;;;>>>>>222222222222222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>22222>>>22222222>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>,,,,;XxBkbjskkknbkjjkjppjjjjjjjpppaujjjppppaiuuiuuiajppauuuaaiuu8===*=&%%&99+...;11;2>>:::::42>;198uiqquaauu==0+1.<:::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222::::::::4444444444444::,.69hcjjjsssssjjjjjjjjsspssssjjjskjsssspaapsjssssssssjjppjsppssssjapi88%%1<<-<:::::>>>><<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;<<>>>>>>>>>><,<::::::::::::::::2:::::::<,,<<---",
+">,,,,>>>>>>>>,,,>>>>>>>>333,>>>>::::,33,333,::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::2222222222222222,,,,,,,,33,,>>>>>>2222222222222273>3,;10BnkkbVVCbjsspau**%o#**==&&&&**&%#o####&*t888tuuuuuuuuuuuwuuuuuuuuuuuuuuuuuu8*==*uue**8*%,;;;>>>>>>222222222222222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>22222>>>22222222>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>,,,,>>;9znbbsskbVkq=uaaapjjjjjjjjpauuuappppppaiuqquiappaauquiiiai8==8$&&&9966.--;<<;.2>>:::::44:;1698aiqaaaau%%0+..,:::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222::::::::44444444::::::<,;9hckjjjkjjjjjjkjjjjjsspssssjjjskkjjjsssadjkkssjssssjkkkjjspssspsaauuu*&+...;<>>222>::<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<>>>>>>>>>><<<::::::::::::::::::::::::<,,<----",
+">,,,,>>>>>>>>,,,>>>>>>>>33,,>>>>::::,33,333,,:::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,33::::::::::::::::2222222222222222,,,,,,,,33,,>>>>>>>222222222222225:3:XX6xnsskjbVVbkkjjjpu=%*uuu*&&&&&&&%#o#&**8t8888tuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu8*==*uu**8899;;;;>,,>>>222222222222222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>22222>>>22222222>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>,3,>>:3.hBnbbsjbbkppjuuuasjkkkkjjpaaa=wapjjjppaiuuuuiaiiiuquiapjji**8&&*9961<-::::<-.>>>:::::44:;;698aiiaaauu0%+1.-,-::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222:::::::::::44444,,,:-<119hckkjjkkkkkkkkkkjjjjjsssssjjjjkkkkjjsjjssjkbkkmmkjdapsjkjssssaaaqaiii88%%++.;>>222:::<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<>>>>>>>>>><<;:::::::::::::::::::::::-:<,<<---",
+">,,,,>>>>>>>>,,,>>>>>>>>,,>>>>::::::,33,,,,,,,,,::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,33::::::::::::::::2222222222222222,,,,,,,,33,>>>>:>>>2222222222222222433;XxVjsksbVVbnbjsppi=%8***=&&&&&&%%%%&*8&&%****8tuuiiuuuuuuuuuuuuuuuuuuuuuuuuu8*==*****8899>,,>>,,>>>>22222222222222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>22222>>>22222222>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>:>>,3,>>:3-XHVkVbmsspjhhaiuipkkbkkkjjppj#wpjjjpaaaaaaiuqqquaaiapajkji*==**&&61;-4444:<-<>>>::::444:-;698iiaaauui 961.;3-::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222::::::::::::::::111;;116ihkkkkkmmmkkkkjjkkjjjjjjssjjsjkbbbkjsssjjsskbmmmskksssjkbksssssaqqaiiiii88891.;3>2>::<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<>>>>>>>>,<;;:::::::::::::::::::::::---<<----",
+">>>>>>>>>>>>,333::>>>>>>>>>>>>>>::::::::::::::::::::::::3333,:::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>33,>>>>>::::::::::::::::::::::::::::::::::::::::::::::::,33,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222222222222222233333,,,,,>>>>>>222222222222222222344:;XhPnskbkkmbbjsjjp8#==*u**8**&&%###&8tt*&&&&**8tuu8tuuuuuuuuuuuuuu*8uuuuuu*u8==*8*=*tt896X>>>>>>>>3322222>222222222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>:3,X9Jjmsbjssp8haiapkkbkbkjjjjjjppsjjppjajjaiapaqaaqqppapapa8%#=**&+.;:44444:<<->>>::::4:43-.199ipaiaaq8#%+..--:::::::::::--::::->333>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222::::::::::222::3:-:,7-:,--<,-XX6998hhkkkbbmmmbbmjjkkjkjjjkjjjssjkkkmbmkkjsssjjjjjsjkmksspasjkjkkkssspqqqiiiipiiii891;,3>--,,<>>>>>>>>>>>>>>>>,,,>>>>>>>>>>>>>:,3,;-;,,,,,,;--:::::::::::::::::::::::::::::<<<",
+">>>>>>>>>>>>,333::>>>,,>>>>>>>>>::::::::::::::::::::::::333,::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>33,>>>>>::::::::::::::::::::::::::::::::::::::::::::::::,33,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222222222222222233333,,,,>>>>>>>2222222222222222>2444:;XcJVbVbkjbbbjasjp*%*8*u8u8*&&&&%#o%*tt*&*****tuuutuuuuuuuuuuuuu**8tuuuuuu*u8==8uu***&+66;>>>>>>>>>>>>>>>>222222222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>43,-6hkjmbkspjiiapjknnbkkkkkkkkjjjjjspjkkkjaipjpqaauippaiuii8==8**&+.-:44444::<->>>:::::433-.698apaiai8*%%+..-:::::::::::::::::::>333>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222:::::::::::22::3,:<--1;...XX.%8ihjkkbkkmmmmmmbbbmmmkjkjjjkjjsssjkkkmbmkkkjsssjjjjjkmmkjssssjjkkbkkkkjaaaauuipaaiii896;1,:-<<<>>>>>>>>>>>>>>>>,,,>>>>>>>>>>>>>-,77,;;;;<<,,<--::::::::::::::::::::::::::::::::",
+">>>>>>>>>>>>,333::>>,,,,>>>>>>>>::::::::::::::::::::::::333,::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>33,>>>>>::::::::::::::::::::::::::::::::::::::::::::::::,33,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222223333,,,,,>>>>>>>2222222222222222>2244:;XcBnbnbkkbVVkaapp%#88=**u8*&&&&&%##&8*&&*t**8tuutuuutu888aaaauu**8tuuuuuu*88*=8ut*=*8961->>>>>>>>>>>>>>>2222222222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>4::;1XxkbVVbsjpiapkknbkkkkkkkkjjjjsspjkVkkjaajjpiaaaaaaaqquu8==8*8*+.--44444::<<2>>:::::44:;198yjjpaau*%%+..-<:::::::::::::,33:::>,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222:::::22::::::3:-;,,116..99998jjkkkkkjkkmmmmmmbbbbmmmjjjjkmkjjsjkkkkkkkkkkjjspjjjkkkjkmkjjjjjjkbbbbkkkjspauuipuuiii896111,,--,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-,3773<-;<<<,<>:::::::::::::::::::::::::::::::::",
+",,>>>>>>>>>>,,,,:>>>,,,,>>>>>>>>::::::::::::::::::::::::3,,:::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>,,,>>>>>::::::::::::::::::::::::::::::::::::::::::::::::,33,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222333,,,>>>>>>>>>>2222222222222222>>244:;.hBVbbkkbbCCbsppa=#**&**8t8*&&&&&&&&**&&*tt8tttttuut88888uuuuuu****ttuutt*88888***&8y91;->>>>>>>>>>>>>>>>222222222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>:::>1XxnjVZZkjjppjjjkkkkjkkkkkkksjjssjkVkkjppjsapaaaaiiiuuuu8==**8891;-:4444::<;2>>:::::3:-169yijjpapu=%%+..;,2::::::::::::333::>>>>::>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222:::::222:::::>>-;;;11169clcckkkjjjjjjkkmmmmmMmmbmmmmjkjjkkkjjjjkkkjjjssssjsssjjjjjjjjbmkjjjjjkbbbbbkkkkjpauiaaiiii89+66173,:3>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:>,7771<<<<<,>>>::::::::::::::::::::::::::::::::",
+",,,>>>>>>>>,,,>>:>>,,33,>>>>>>>>::::::::::::::::::::::::,:::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>,,>>>>>>::::::::,:::::::::::::::::::::::::::::::::::::::,33,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222222222222222233,,,>>>>>>>>>>>2222222222222222;>>::2;.9JUVbkbbbVVkssjp8%=**t**88**&&&&&&***&*8ettte*tttt**tttttttuut*****ttuut888888**uet91X:3>>>>>>>>>>>>>>>>222222222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>:>>>>>>>>-::27;vxkVZZksssjjjjpsjkjkkkkkkkkkkkjjjjpjsppppajpaaaiuuuuuu8*=**8896;;>44442>><22::::::2-;798uisspppu=%96..;,:::::::::::::,33::>>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222:::::222:::::-,-11XXX98hkkkkkkjjjjkkkjjkmmkjsMmmmmmmmmkjjjjjkkkkkjjjjsssssssjssjjjkkkbbkkjjjjkmbbbbbkkkjjpaaapaaaiu8%961<,,44>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>--,7771<<<<,>>>::::::::::::::::::::::::::::::::",
+"33,>>>>>:>>,,>>>>>>,3333>>>>>>>>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::,,,:::::::::::::::::::::::::::::::::::::,33,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222,,,,>>>>>>>>>>>,2222222222222222;1,::,,;qJUVmkbbbbbsskkju%&&8t8*8***&&&&&&&***8t*ett**eut**8uuuuuuuuut*****8ttttu8***8uuutiy6-23>>>>>>>>,,,>>>>>222222222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>::::::::::::::::>>>>>:::>>>>>>>><,:223;hITUZkksspjjspsjjkkkkkkkkkkkkkjspsjspaappjpaaaiuuuuuuq88888896..->::22>>>22:::<:::-;98iuuaaappu=%9+..<>:4::::::::::::,:::>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222:::::22::::::>3-1;X99hhjjjssskkkkkkjsjjkkkkkjMMMmmmmbbmkjjjjkkkkjjkkkjsspassjjjjjjjkkkkbmmkkssjkkkbbkkkkkjpaapaaaiu88&96<<,44>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>--;,7761<<<<>>>::::::::::::::::------::::::::::",
+"33,>>>>>:>>,,>>:>>>,3333>>>>>>>>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::33,:::::::::::::::::::::::::::::::::::::,33,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222,,,>>>>>>>>>>>>,2222222222222222;1,-:,,;hJPnmkbbbbkskbka% %&&8**8*=*8t8*&%&&***8**tt**ttt**tuuuuuuuuut*****88***8*********y96,44>>>>>>>>,,,,>>>>222222222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>::::::::::::::::>>>>>:::>>>>>>>><->252X1H^~Cbbjsppjjssjjkkkkkkkkjkkkkkjsjjjpaaaappppppauqqqquuq88*9961.-<>>>>>>>2::::<::,-19hiuuaaaaa8%9%.X;<>:4::::::::::::::::>>:>>,>:>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222:::::::::::2237X179ccjjjpasssssjjkjjjjjkkkkkkMMMMMMmmbmkkjssskkjssjjsssssaasjjjjjssssjkmbmbmkjjjjjkkkkkkkksspaapauuuu*y96<344>>>>>>>>>>>>>>>>:::>>>>>>>>>>>>>>:--;<1<1<<<;::>::::::::::::::::------::::::::::",
+"33,>>>>>:>>,,>>:>>>,3333>>>>>>>>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::33,,::::::::::::::::::::::::::::::::::::,33,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222,,,>>>>>>>>>>>,,2222222222222222;1,-:,11cBJCVnnbbbkknVk*  &8&**tt*=*uiu*&%%&&&&&***ettttt*tuuauuut8******888****===**=##=&&+X-44>>>>>>>>>>>,,,,,222222222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>::::::::::::::::>>>>:::->>>>>>>><->7423X9P^CVVksjjjjjjjkkkkkkkkkjjjjjkjjsssppaauiappjjau8888uuq8889996;;;>>>>>>>2:::<<::,-19hqqaapaau*%%+XX;;::4::::::::,:::::::>>:>,3>:>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222::::::::::222-1-fhvcckjsaasaaaapsssssjjjjkkkkmMMMjjjmmmkjssaajkjssssassssaapsjjjjsssskkmkmbbbbmkjjkbbkkkkksssjjjpauuu*ih9<334>>>>>>>>>>>>>>>>:::>>>>>>>>>>>>>>>>;-;;;61<<;-->::::::::::::::::------::::::::::",
+"3,>>>>>>>,3,>:::,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::::,,33::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3333>>>>>>>>>>>>22222222222>>>>>>>>>>>>>>>>>>>>>>>>>>222>>>>>>>>533-:7.1knVVnmknnnbknba# %****8t8888ttt8%%%%&&&&&&*tttttetuuut*****w*=*tuut*&&&99669999966;.;;;-22222222222222222222222222222222>>>>>>>>>>>>>2222222222233322222>>>>>>>>>>>>>>>>22222222222222222222222222222222:::--:::::::::::::::::::::::::::42>22442XBUZZVakjpjkkkjjkkkkkkkkkkjjjjkkjjppapppaaaaiqqqq**wuuuue$$89+X.>>2:::::;;;;<:::5>;98awaaaaaa899..-;>>22::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::-----::::::22222:,1qkjsjmkjjsjjjaapaapsjsjjjjjjjmmjjsjjjkmksssssjkjjjjjppsjsppsjjjjjjjkkmkbbbbbbbbmbbkkkkkkkjjppijaqiuqauii9611..-<:433>>;;;;>>2:::::::::::::::::::::::::,,,,:::>>>::>>>:::::::::::::::::::::,,,",
+"3,>>>>>>>,3,>:::,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,,,,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::,33::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3333>>>>>>>>>>>>2222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>222>>>>>>>>>>2:2>1hnnVnmbnbnnbbVnp=#=*888tt**&&*8*&&&%%&&&&**ttttteuuuutt***=***==*ete88899+++6666661;;;;;-22222222222222222222222222222222>>>>>>>>>>>>>2222222222233322222>>>>>>>>>>>>>>>>22222222222222222222222222222222:::--:::::::::::::::::::::::::::42>22442;B~~ZVjkjpsjkkjjkkkkkkkkkkjjjjkkjjppppppaappiqqiaq**wuuue$&89+.1>>2:::::;;;;<:::32;68uudaasau899..-;>>22::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222:3X8kksMkjjjjjjaaaaapssssjjjssMmmmjsssjjmmmjssssjjjssjjssssssssjjjjjkkkkjjmbbbbbmmbbbkjkkkkkkjspajaqiauaiq8891.1<<<:222>>;;;;>>2::::::::::::::::::::::::::,,::::>>>::>>>>>>>>>>>:::::::::::::,,,",
+"3,>>>>>>>,,>>::>,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,,,,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,333>>>>>>>>>>>>222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>22>>>>>>>>25243-1cHnnbjnCknnbnVka=%=88ttt8**&&&88&*&&&&&&&&*ttttttuut****&********ttt889%6.XX....;,<;->,>>22222222222222222222222222222222>>>>>>>>>>>>>222>>>>>>>>33222222>>>>>>>>>>>>>>>>22222222222222222222222222222222:::--:::::::::::::::::::::::::::4::>2442.BQ~ZVkkkjjjkkkkkkkkkkkkkkkjjjjjjjppppppaajjiqqpauw**88te*889..,>>2:::::;;;;<:::3>;18uasappa8%+6.--:>>22::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222:,X8kmsmmjssjkjppaaasssssjjjssmmmkjsssjjmmmmjsssjjjjsjjssspsssssjjjjkkkkmbbbbbnbbbbbkjjjbkkkkjsahjpiaaapaiii86...--:22>:>;;;;>>2::::::::::::::::::::::::::,,::::>>>::>>>,,,,,,,,:::::::::::::,,,",
+"3,>>>>>>>,,>::>>,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>33,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>332-2,;9HnnbbVVjnnnnnj= %=*8ttt***&%&888*&&&&&&&$&*etttuut****&$********&&&&%++.<.;;;--;;>:>232>22222222222222222222222222222222>>>>>>>>>>>>>222>>>>>>>>22222222>>>>>>>>>>>>>>>>22222222222222222222222222222222:::--:::::::::::::::::::::::::::4::>22221BUZZVnbkkkkkkkbbbbbbkkkkkkjjjjjjjpppaaiaapjaqqpauuuu888*tyy9..;>22:::::;;;;::::2-;1iipsssai8%+6.--:>>22::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::,,:::::::::::22222:;1hkkmmmkssjjkjjjssssssjjjjsjmmmjssssjkmkkmjssjjjjjjjsassssssssjjjjjkkkjmbVbmbbVbbkjjkkkkkjjjjphjpaaaaauapi896X..-<,2::<;;;;>>2::::::::::::::::::::::::::::::::>>>::>>>,,,,,,,,:::::::::::::,,,",
+"3,>>>>>>>>>>::>,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,::::::::::::::::::::::::,:::::::::::::::::::::::>,3,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>222-:,;vJCVnVVbbbbbbki=%#&**88*&&&%#%&**&&&&&&&&#$&**8tuut*****&#&=&%%%%   XX...,,>,,>>>::>2222222222222222222222222222222222222>>>>>>>>>>>>>2222222222222222222>>>>>>>>>>>>>>>>22222222222222222222222222222222:::--:::::::::::::::::::::::::::::<<>2221BUVZVbbkkkkkkkbbbbbnbbkkkjjjjjjppaiiiiuuuapiqqiiuuuut888tyy91;,>22::::<>;>;<::::-11hihjjsaii96..--:>>>2::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::,,3-----::::::22222,.9xjjbMbmkjsjjjjjjsssjjjjjjkkjjjjssssjkkjjjjsjkjjjjjjsaasssssssjjkmmmmmjmbCbkVCVbbkjkkkjkkjjjjphaaaiiaa=uai889%...<,::><;;;;>>2::::::::::::::::::::::::::::::::>>>::>>>>>>>>>>>:::::::::::::,,,",
+"3,>>>>>>>>>>::>3,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::,,,:::::::::::::::::::::>>,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>22>>>>>>>>>>>>>>25>33-1cJCVnnbknbnbkpw=*#&*****&&&&%#%%%%%%&&&&&$&&&****8*****&&#%&%oo++++....;;2>>>2>>2>222222222222222222222222222222222222222>>>>>>>>>>>>>2222222222222222233>>>>>>>>>>>>>>>>22222222222222222222222222222222:::--:::::::::::::::::::::::::::::<<,222XkUVVbkbjjkbbkmbbbnVVbbkkkjjjjjjaaiuuuqquuiphiqqaaut8tiyyy996;;3222:::<<>>>;<:::2>;;9ihjkjiii96X.--:>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::,,,-----::::::222223X9xjsbMmbbmjjssssssssjkjjsjkmjsjsssssjjjjjjjsjkssjjjjspsssjsjjjjjMMmmmmmbbCVmVCnbbmmbkjjjjssjjpiquiqquuuuahi8986..<,::,<;;;;>>2::::::::::::::::::::::::::::::::>>>::>>>>>>>>>>>:::::::::::::,,,",
+"3,>>>>>>>>>>::>3,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::33,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,33::::::::::::::::::::::::33,:::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>222>>>>>>>>>>>>>>522,-1hnnnnbjknnVbja*==%***&&&&&*&&%%%#%%%&&&&&*&$&&**&**&&&&$#&&&#oo++661<;;;<222222222222222222222222222222222222222222222222>>>>>>>>>>>>>2222222222222222333>>>>>>>>>>>>>>>>22222222222222222222222222222222:::--:::::::::::::::::::::::::::4:<<<222X9CZVbmbjjkbbbbbbnVVVbbbkkkjjjspaiuqqququaaphhq*uuu88ty8y966;;->22::::<<>><;<<::>3-;19ihhhii96..---::>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222,.1hksmmmbbbkjssjjssssjjjsssjjjssssssssssjjjssjjssjjjjssssjjjjjjMMMMMmmmmbmbbmVmbbbbmbkkjjsapjjpi88q=*uuuuapa8889611,::3<;;;;>>>::::::::::::::::::::::::::::::::>>>::>>>>>>>>>>>:::::::::::::,,,",
+"3,>>>>>>>>>:::>3,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::33,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,33::::::::::::::::::::::::33,,:::::::::::::::::::::>>>>>>,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>222>>>>>>>>>>>>>>33-;1X9kjnVkknbbnksi*%#=*8*&&&&%&&&%%%#&%&&**&&*&$$&**&***&&$$$**%oo++...;;;>>,222222323332>>>222222222222222222222222222222222>>>>>>>>>>>>>222>>>>>>>>22222333>>>>>>>>>>>>>>>>22222222222222222222222222222222:::--:::::::::::::::::::::::::::4:<<<>227XVAVbbnjjkbbbbmnVCVVbbbkkkkjjppiuqqquiiuapaaiq#8uuu88996...;>>222:::::<>><<<<::-3-;198hhhhh91.;---::>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::,,:::::::::::::::::22222,1XqkjsmmbbbkkjjjjjjjjssssssjjjssssssssssjjsssssjjsjjsssssssjjjsmmmmmmmmmnmbZCCkbbbbkkbbkjpqajjphu88%=qu=ququiq*89661-:3:<<;;>>>::::::::::::::::::::::::::::::::>>>::>>>>>>>>>>>:::::::::::::,,,",
+">>>>,3,>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3333,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,3333::::::::33333,,,::::::::::::::::::::::::::::::::>>>>>>>>>>>>>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>35>>X11hzkbbjjkjbPkjju%8****&&&%#%**&%%%##%&88*&8&%&&##&*&***%#%%&88%XX1;;,332::>>>>>>>>>>>>>>>>22222222222222222222222233322222>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>22222222222222222222222222222222::::::::,,,22:::::::::::::::::::4:<<<>221XVAVbmmkjbnnbbmbnVVVnbbkkkjjspjpaiuuiiiaaaiii8=*quuy9XX.;;;>>>255:::::<>>:<<<<::2>>;.XX9961...-;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,71%akssmmmmkmmmjjjssjjjssssssskjssssssssssssssjssssssssssssjjjjmmmmmmmmmnCCCVksmVbbjsbbksssaapphiq88uq*uaauuauq8966;-,::<<;;>>>::::::::::::::::::::::::::,:::::>>>>>>>>>>>>>>>>::::::::::::::::",
+">>>>,3,>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::333,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,333::::::::33333,,,::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,-16hkjjkkkkkkVbjj==8******&&%%&*&&&&8*&&***&&&&*&##&****&###&%&&+..1;>222244>>>>>>>>>;;;;;;;22222222222222222222222233222222>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>22222222222222222222222222222222::::::::,,:22:::::::::::::::::::42<<<:222XzUZVbMkkbnnnbbbbVCCVnbbkkkjjsjjpaaiaiiaapppaq=*888y6XX;;;<>>225::::::<:::<<<<::22>;;.......;;,>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,798pjsskkmmmmmmkjsssssssssjjssjjsssssssssssssssssssssssssssjjkmmmmmmmbVnVVVCCVbVVbjsjbbbjjjpaaapauquaaaappaqquu8&66;-,::<<;;>>>::::::::::::::::::::::::::,:::::>>>>>>>>>>>>>>>>::::::::::::::::",
+">>>>,3,>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::333,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,333::::::::3333,,,,::::::::::::::::::::::::::::::::>>>>>>>>>>>>>,,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3;16jkkbbkkknbkkpj=8#t*&***=*&&&*****t8*&=**=%&**%o#&****%#o#&#o+++1;;2222222>>>>>>;;;;;;;;;;22222222222222222222222232222222>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>22222222222222222222222222222222::::::::,::2::::::::::::::::::::44<<<:442XhUUCCbkkkbbbbbmbbVCCVbkkkkkjjjjjjpppaaaapphpq**88886XX;;;>>>:::::::::::::<--<::222>;;...;;;;--::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::7fhhsssjjkkmmmMkjsaasssssssjjjssssssssssssssssssssssssssssssskmmmbmmbCCCCVVCCVVVbjssjbbbkkksaaaaiiuipjjappiwwqq8&%6.->::<<<;>>>::::::::::::::::::::::::::,:::::>>>>>>>>>>>>>>>>::::::::::::::::",
+",>>>,3,>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,3::::::::333,,,::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>,,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3>>;X6kkbbbbjknCkkjj=8#t&&**&=****8888*8*&&&***%&**#oo&*88*%##%#Oo++61;>2222222>>>>>;;;;;;;;;;;222222222222222222222222222222>>>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>22222222222222222222222222222222::::::::::::::::::::::::::::::::42<<<:442;9PQQUnbkkbbbbmmmbbVVnbkkkkkjjjkjjjppppappppaq*8ut886.;<<::::::::::::::4::<--<::242>>;;,,,,,>--::::::<<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::-39vhpasjjkkkkjsjjsaasssssssssjjssssssssssssssssssssssssssssssjjmmbmmbCUQUVbVZVVbbjssmbbkkkkspspiiiuiajjpaiqqiqq*=%6.->-:<<<;>>>::::::::::::::::::::::::::,:::::>>>>>>>>>>>>>>>>::::::::::::::::",
+",>>>,,>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,::::::::33,,,:::::::::::::::::::::::::::::::::::>>>>>>>>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>23>;;X8xbkjkbkjxCknna%*tt&&**==8888888***&&&=****&&%#o#%**8*%#%%###%+61;>2222>>>>>>>>>>>>>>>>>>>22222222222222222222222222222>>>>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>22222222222222222222222222222222::::::::::::::::::::::::::::::::44:<<:444>1BUUCbVbbbkkbbbbbbbbbbkkkkjppjjjjppppjpsjjppi8qut896.;<<<:::::::::::::4::<---::4442:::-::::::::::::<<<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::19hhapjjkkkksssssssssssssssssjsssjsssjjjjssssssssssssssssssjjjmmmmbVUQQQVkbZCZbbmjmbbbkkkkssssiaiuuippppaaaaiq*=&6.-,-:<<<;>>>::::::::::::::::::::::::::,:::::>>>>>>>>>>>>>>>>::::::::::::::::",
+"3>>>,,>>::>>>>,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,,::::::::::::::::::::::::::::::::::::>>>>>>>>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>2>>;;1cnkjjbnkkxkijk===ut****==88ttt8*******=&&&8*%%#%%%&**&%%%%##%%+11;222>>>>,,,>>>>>>222222222222222222222222222222222222>>>>>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>22222222222222222222222222222222::::::::::::::::::::::::::::::::44><<:4442XhCUCbbbbbkkmmbbbbbbbbjjkjpaasjjjjppjjpsjppau88ut896.;<<<<::::::::::>>4::<---<:44444::4::::4444::::<<<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::4:.1qhaajjkkkjsssssssssssjjsssjjsssjjssjssssssssssssssssssssjmmkmmmmbCQQQQVkbZZZbbmjjbbbkkkjssjsaaaiiappihjjiqqi**891;,-:<<<;>>>::::::::::::::::::::::::::,:::::>>>>>>>>>>>>>>>>::::::::::::::::",
+"3,>>,,>>::>>>>,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-,;;6xBkjbVnkkzuqpj#*=88tt8*=*88tt8&%&*88*&%%%%**&%&&********&##$%%+11;222>>;,;2222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>22222222222222222222222222222222::::::::::::::::::::::::::::::::44><<:4442X%bPPnkknVbkkkbbbbbbbbssspauapjjjjjjjjpsppaiuq8u8991.<<<<<<::::::::>>>4::<---<:444444:3334444444:::<<<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::43-X9iaapjkkjssssssssssssssssjjjjssjjjjjsssssssssssssssssssssmbmbbbbVCQQUCVbVZVVnmmssbmmkkkjsjjspspaaaaiuahhu8qi**891;,-:<<<>>>>::::::::::::::::::::::::::,:::::>>>>>>>>>>>>>>>>::::::::::::::::",
+"3,>>>,>:::>>>>,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::>>>>>>>>3,,>>>>>222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-,,.6znkskVbjhhpkVk=88t8uu8**888t8*%#&888=%####&****888888888*%==%o+11;22>>>;;12222222222244444222222222222222222222222222>>>>>>>>>>>>>222222222222222222222222>>>>>>>>>>>>>>>>22222222222222222222222222222222::::::::::::::::::::::::::::::::44><<:4442XXjVCbskVVbkmmbbbbbbbbjpaaaaapjkkkjjjjsjjpppai8ut891.<<<<<<::::::::>>>4::<---<:444444:::44444444:::<<<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::43-X9ipjajkkjsssjssaassssjsssjjsjssjjjjsssjjsssjsssssjjjsssasjmbbbbbVCQQUCbVZZVZbmmsjbmkkkjjsjjjjjspaaiiiiiiiqqq**896;,-:<<<>>>>::::::::::::::::::::::::::,:::::>>>>>>>>>>>>>>>>::::::::::::::::",
+">>>>>>>:>>:>,3>:::::::::::::::::::::::::3333,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222>>>>>2222222222222222222222222222222222222222433;X8ckkknkapaakkJk=%=88t88t88tut&#o%*=8*%%#o#***tt88888*88**8**@@996;;>>>2>>>>2222222222222>>>>>>>>>>>22222222>>>>>>>>>>>>>>>>22222222222222222222222222222333>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>22222222>>>>>>>>>>>>>>>>::::::::::::::::4444444443:.<gzLjknbbZbbkmbbbmmbjjaaapppjjjsssspjhiauuuauiy91552>>>>>>>>:::>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>,,,>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>19hhppdsskjjjsaasspjsssssssjsssssjsssssjjjjsjssssssMsssasjbbmbVVCbsUUCVVZVCZmmmbmkbkjjssjjjkjsppppppaaaiuqqut$#%1;;>::;<>>22::::::::::::::::>>>>>>>>>>>>>>>:>>>>>>>>>>,>>:>>:::::::::::::::,",
+">>>>>>>:>>:>,,>:::::::::::::::::::::::::333,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222>>>>>22222222222222222222222222222222222222224231+ikkjkkkpjspjjbp=**%*tt8&&8iu8=#%*8*****%%&**tttttttt*8*&&*&&%@661;<>>>2>>>>2222222222222>>>>>>>>>>>22222222>>>>>>>>>>>>>>>>22222222222222222222222222222333>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>22222222>>>>>>>>>>>>>>>>:::::::::::::::::44444444--,..gxkkbbbVbbbbbbbmmbjjpappppsjjppppphiiiuueett961552>>>>>>>>:::>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>,,>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::2>>>;7yippdassjjjpaapppjspaaapjjssssssssjssssssssssssssjssssssmbbbbbVbsbUCCCCZCVbbmmmbVbsjsspsjjjsssjppaiiiuq8qu=#%991;-::;<>>22::::::::::::::::>>>>>>>>>>>>>>>:>>>>>>>>>>,>>:>>:::::::::::::::,",
+">>>>>>>:>>>>,,>:::::::::::::::::::::::::333,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222>>>>222222222222222222222222222222222222222235316hxjknkkijpuawuq8iu8ii8*888yu8*&*888**888=*88tuutttt8&&%o#%#@%+++.;,>>>>>>>>2222222222222>>>>>>>>>>>22222222>>>>>>>>>>>>>>>>22222222222222222222222222222233>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>22222222>>>>>>>>>>>>>>>>::::::::::::::::::4444444->7;X.gnkbVbVCbCCVnbkksppppppsssjsppsspqqquuu*&8*+1;522>>>>>>>>:::>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>,>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>2222::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::3>>>;19iiaaauasspaaaaaappaaaaasjsssssjjsjjjssssssssjjsssssssssmbVZVbVVnnUCVCCQCmbbmmmnCVsjjsapsjppppppaiuuqq8888$#%961,>::;<>>22::::::::::::::::>>>>>>>>>>>>>>>:>>>>>>>>>>,>>:>>:::::::::::::::,",
+">>>>>>>:>>>>>>>>::::::::::::::::::::::::3,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222>>>22222222222222222222222222222222222222224511+hxhkJjjqjsqkw=iiq*8pi8*8**tu8**888*=8tu8*888tttt888=%%%o#%#+++...;>>>2>>>>>2222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>22222222222222222222222222222222>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::::::::::::::4444444>,<;.1kzkVVbCbVVVnbbjspppsjjjspssppppaqwwqu8*&&+XX;>22>>>>>>>>:::>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>32222:::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::3>>,;.6yiaaauaaaaiaaqqiqaaaaaaasssassjjjjjsssssssssjjssssssssMmmbnnbbCCVCZbbVQCbbbbbbbVbssjspapjppjppaiuqqquu88*#o%%.;,,:;;<>>22::::::::::::::::>>>>>>>>>>>>>>>:>>>>>>>>>>,>>:>>:::::::::::::::,",
+">>>>>>>:>>>>>>>>::::::::::::::::::::::::,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,::::::::::::::::::::::::::::::::::::::::::::::,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222222>>222222222222222222222222222222222222222245>.Xijaknjjqkkjkuwapq8u8ii8% #tu88888*&*8tt88888888888**=**&&*&66+..;,>>>2>>>>>2222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>22222222222222222222222222222222>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::<:::4444:3>--71Xqxkjbbbbkmmbbbkkjjjkjjjjapppppaqwwqw8889+.X.;32>>>>>>>>>:::>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>32222:::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>:,,X.yiaaaaaaqqqaaqqiqqqaaaaaskjsaasssjssaaapspssjjssssjMMMMMMmbbnbnCVbCnbkVCCbbmbbmmjssspppppsjjspaauuuquq888Oo%61;--:;;<>>22::::::::::::::::>>>>>>>>>>>>>>>:>>>>>>>>>>,>>:>>:::::::::::::::,",
+">>>>>>>::>,,>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::322222222222222222222222222222222222222222222222221;+8hpkxjjqkbsiaquiipa*uut&o#tiu888*==*8t88888uu88888****8**8*96..<1,>>22>>>>>2222222222222>>>22222222>>>>>>>>>>>>>>>>>>>>>>>>2222222222222222222222223322222222222222>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::<<:::444442>,;;;%kjpkbkkkkkkbbbbkkkkjjsspppppauwwquq88991..;,,>>>>>>>>>>:::>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>:>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::::::::::::3-:3..9iaappspaqwqaqupqiuuiiapjjjsaapsjjjjjsssssssjjjjjssMMMMMMmmbVnbVnnVbbkbZZbmmbbjkjsssssspppjjpaaauuu88888u#o%6.->>:--<>>22::::::::::::::::>>>>>>>>>>>>>>>:>>>>>>>>>>,>>:>>:::::::::::::::,",
+">>>>>>>::>,,>:>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::33,::::::::::::::::::::::::::::::::::::::::::,33::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::33222222222222222222222222222222222222222222222227119ipjVkkjanbuajiqqqi*qu888&&taiut8*=**8t88uutuu888t**8***&8t896.;,,>2>22>>>>>2222222222222>>>22222222>>>>>>>>>>>>>>>>>>>>>>>>2222222222222222222222223332222222222222>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::<<::::444:23,-;10hkjkkskbbkkkkkkkkkjjsssjjjppaiqwuuq8896.;;,>>::>>>>>>>>:::>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::-3:-3-.9iiaapssspquuwasuiuuuqqapaaaapssjsjjjjjjjspsjjjjjjjsssMMMsmMmbbbkbmjjmmbbbmmbbkkjjjjjspaaqapaiauq8888888u%++.X-33:--;<>22::::::::::::::::>>>>>>>>>>>>>>>:>>>>>>>>>>,>>:>>:::::::::::::::,",
+">>>>>>>::>3,>:>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::33,,::::::::::::::::::::::::::::::::::::::::,,33::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::33322222222222222222222222222222222222222222222253;18iijnijjjVVaapq8q8u88uuu*#%tpiuu8**8*888uiutuq******8****8ii7<-;>-->22>>>>>>2222222222222>>>22222222>>>>>>>>>>>>>>>>>>>>>>>>2222222222222222222222223332222222222222>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::<<<:::24:::-:,>-X9hjjjskkkkkkjjsjjkjjjjjjjpaaaiquuiii96.->3,:--:>>>>>>>>:::>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>:::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::-7:-3-.6yiuuupjjjauq*ijuuuiiuqqqquapsppaaapjjspppaapjjjjjjjsssmmMbMmbbmsmsssksbbmmmbbmmskkkjpuqq*upaaaiq#=8q8888  +1;;>-:--;<>22::::::::::::::::>>>>>>>>>>>>>>>:>>>>>>>>>>,>>:>>:::::::::::::::,",
+",>>>::::,,,>>>>>::::::::::::::::::::,,33::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,33333::::::::::::::::::::::::33,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222222222222222222222222222222222222233333322222221;8hpJVhkqjVksuuqq8*8uquiiiiiuiuuuu8**88ttuuuu8**8*******8yiy9;;;;>>222222>>,,2222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>22222222222223332222222222222333>>>>>>>>2>>>>>>>2222233322222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::<<<<::::::>>>>>>119hkjpppjkkjjkjjjjjjjspspaaaaqqqquq891->2::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::>>>>::>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>:::>>>>>>>>>>>>>::::::::::::::::::::::<.9yttuupppppaqqqq*quiu88qwupppaapaaaapppaiiahhpjkjjjjkjsssjsmmmmsaksjbbbbmbbbjsssjjspauqw*uaaiaiu=8tu8888  +1;-:,:<<;<>22::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>::::::::::::::::",
+",>>>::::,,,>>>>>:::::::::::::::::::::,33::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,333,::::::::::::::::::::::::33,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222222222222222223333322222245,X9iiBkpkqqkpsjpiqqqipuiaaaaaiuuuu**8t*8ttuuuu****8t88=*8yi89+>;>>>>22222>>>,,2222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>22222222222223332222222222222333>>>>>>>>>>>>>>>>2222233322222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::<<<<::::::>>>>>>X.6ikjaaajkkjkkksjjjsssjppaiiiuquii86;;>2244::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::>>>>::>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>:::>>>>>>>>>>>>>::::::::::::::::<:::::<.68**uupppppauuuu**8qq88qquiaaaaaaapjjhiu888iiqihhjjjjsssssassjkjsjajbmbmskmmjssjjjspaiqq*uaiuiut888t8*%#++61;-:::<<;>>22::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>::::::::::::::::",
+",>>>::::,,,>>>>>:::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,3,,,::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222222222222222222223222222245,X988znjkipkkbkjuq8quauappaaaauaut8tt*88ttuuuu88*******&8y86XX>>>>>>>>22>>>>>>2222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>22222222222222332222222222222333>>>>>>>>>>>>>>>>2222223322222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::<<<<::::::>>>>>>;1X%hjapppjjjsssasspauapjjhaiiipiiy9.X-32444::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>:>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>:::>>>>>>>>>>>>>::::::::::::::::<:::42<;.9%*uuaappauqq8*8*=*8888uuiiapaiiiiii8%++XX++X+98qqiapsssaaasskjjsakbjmkjkmkjjjkssaaiuuuuuiuuuu888*88&o ++1;;:::<<<;>>22::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>::::::::::::::::",
+">>>:::::,,,>>>>>:::::::::::::::::::::::,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222222222222222222222222222222222>>42,.698kVkjijkkkkpqqqqqqipppiiaaaautuau*ttttttuut8******88996.X;>>>>>>>>>>>>>>>>2222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>22222222222222222222222222222333>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::>>>>>>>7XXipajjpppaaaapsjpuuuijpaiiiiih86..;>:4444:>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>:::>>>>>>>>>>>>>::::::::::::::::<::444>;69%&uuaaspauq**=8*====88iiiiii899966++XX.XXX.X.11698qiiaaaappsksppakkjmkmmkjjjkbsaauqquiuuuuuut8t8*&**%o66.--:::<<<;>>22::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>::::::::::::::::",
+">>>:::>>,,,>>>>>::::::::::::::::::::::::::::::::,:::::::,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,:::::::::::::::,::::::::::::::::::::::::222222222222222222222222222222222222222222222>>>43,;698jJnhijkppjaqqiiuqipjpaiaaauu*tuauuut**tuu****eet88896.;;5>>;;;>>,,,>>>2222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>22222222222222222222222222222333>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::>>>>>>>1X1iu8jkaipjjjjjkkjppaauq88qq8896XX;,>-:4442>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>:::>>>>>>>>>>>>>::::::::::::::::<<>222>;69o%uupappauuu8**8*=%%=8iii89+XX......;<;;;<,;<,;.1168ihwqqaapkjqapjsskjkkkjjjkkspaiqqqquuuuuut8t8*%%&*&6..--:::<<<;>>22::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>::::::::::::::::",
+">>>::>>>,,,>>>>>::::::::::::::::::::::::::::::::,,,:::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::,,,::::::::::::::::::::::::222222222222222222222222222222222222>>>>2222>>>>44:;6%8iBBhipjapjiqqiaaaapjpaaapaaa*$$*uutt**tuu****e**&&991.>3>>;;;;>>,,,,>>2222222222222222>>>>>>>>>>>>>>>>>>>22222222>>>>>>>>22222222332222222222222222222333>>>>>>>>>>>>>>>>33222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::>>>>>>2>;9h8=pkpipjjkkjjjjjjpiq88qi88%1;;-;::::::22222>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>:::>>>>>>>>>>>>>::::::::::::::::;;>2422;16 %tuppppauuu8*=88=%%%=9996.XX..;;<>:::---::::-,<.X.68huuquuiji*uapssssssjjjjjjjjjpiqqquuuuuutt88%  o%%...-::::<<<;>>22::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>::::::::::::::::",
+">>>::>>>,,,>>>>>::::::::::::::::::::::::::::::::33,:::::33,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,33:::::::::::::,33::::::::::::::::::::::::22222222222222222222222222222222222>>>>>222>>>>>44-16%8tkBiquiiaauquiaappppaaaaaaaau=##****ttuuutttte&%@%++;;222;;;;;;;,,,,>>2222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>22222222333222222222222222222333>>>>>>>>:>>>>>>>33322222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::<<<>>>4>,9y88ujaapappappaaaaauqqyu88%+--;;--:3:::22222>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>::::>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>:::>>>>>>>>>>>>>::::::::::::::::;;>2222;16+%8uaappauu8*=*8q8*==%611..;11>,334444,,2444443,-..199aiuiutu%8uiassapqssjsssjjjjjpiqquuuuuttt88%     ..--::::<<<;>>22::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>::::::::::::::::",
+">>:::>>>,,,>>>>>::::::::::::::::::::::::::::::::33,,::::33,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,33::::::::::::,,33::::::::::::::::::::::::22222222222222222222222222222222222>>>>>222>>>>>44-66988zJpiiaauqquiaappppaiiaaiutuaa*##=**uuuuutttte&%@&+X;,>23;;;;;;;,,,,>>2222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>22222222333222222222222222222333>>>>>>>>:>>>>>>>33322222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::4:::::::::<<<<>>4:-1988*uippiuiquuuqquqq*888%o  ;---:::-:::>2222>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>::::>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>:::>>>>>>>>>>>>>::::::::::::::::;;>2222;19%&tuauppauuuuu8uuq888%11..;1;->4444444::::444444,<...+tttiit8 uuuakswassjsaasjpjjjjpiiuuiut88tuu8#ooo ..<,2:::<<<;>>22::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>::::::::::::::::",
+"::::::::::::::::::::::::::::::::333,,>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222222222222,,,>222222222>>>3,1+8&opBKcqiiu*uuiiaaaapiuuuuuuttttuue*$$*eeetett**8899..;.;...>>>>>>>>222222222222222222222222222222222222222222222222>>>>>>>>2222222222222222>>>>>>>>22222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>22>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::;;;1699yyyyiiy8977667f97771;--;;::::::::::::::::::::::::::::::::::::::::22222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>><<--<.++ o@&*tuuyphh996767777766::::::::::::::::::::::::::::::::68hy9++%yytuppawaappauuuspppppaqyiiuuuwu*8  991;::::::::::::::::::::::::::::::::::::::::::::::::<<<:::::::----<<:42,:-----<<::::",
+"::::::::::::::::::::::::::::::::33,,,>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222222222222,,,>22222222>>>>,11+8&#hJKcihiuuuiiiaaaapiuuut**ttttuuee$*uu**eetttty966.;;;---->>>>>>>>222222222222222222222222222222222222222222222222>>>>>>>>2222222222222222>>>>>>>>22222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>;;;1699hiyy896+1;;;161;1,;;;;;;::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::---;..++++&*tuiiy96..;;;;11;..::::::::::::::::::::::::::::::::6999XX+9988uapaappppauuaaappjspayyiuuuuu*u%097--::::::::::::::::::::::::::::::::::::::::::::::::<<<:::::::<<<<-.:::::--<-<<<::::",
+"::::::::::::::::::::::::::::::::3,,,>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222222222222,,,>22222222>>>>;11+9&%kIBhhiiauuiiiiiiiaiuuu8**8888tte**uautut=&&99996.;<<;<--->>>>>>>>222222222222222222222222222222222222222222222222222222222222222222222222>>>>>>>>22222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::2>;;;11+996+.XXX;;;;;;;---;;;;;;::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::--;;.1.X++%98996...;----;;;..::::::::::::::::::::::::::::::::699+XX6y+&8tuapppaaaauuupppjjjaiyyuuuuuuui8+6;X-::::::::::::::::::::::::::::::::::::::::::::::::<<<:::::::<,,<<.::::::<<<<::::::",
+"::::::::::::::::::::::::::::::::,,,>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222222222222,,,>2222222>>>>,;1.+8%tBIxihiuuauiiiiuuuuuuuu8*=&&&888**ttttuha%++.1111;>>>>>:::22222222222222222222222222222222222222222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>2>>>>>>2>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::42>>-...1..X.;;1;<<;;;;;-;;>,>;-::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::--;;1..X.+66....;,>:2>>>>>;;::::::::::::::::::::::::::::::::.661..69.+98uapapaaappppppjjjjpiiyuuuu**ii8+1.-<::::::::::::::::::::::::::::::::::::::::::::::::<<<::::::--,,7<;<<-::,,:::::::::",
+"::::::::::::::::,:::::::::::::::,,>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222222222222,,,>2222222>>>,,;1199%hIIcihpuuuiiiiiuuuuu8uu8*=&&*8888**&&*thh*..X.;;,>2222224422222222222222222222222222222222222222222222222222222222>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>2>>>>>>2>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::444:>--.1<;;>,22-;;;;-;>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>44::::--;;;;.;11..;<>>>>242>>>>>::::::::::::::::::::::::::::::::...;<666.+98uaauauuuaaaaiiaappppittt*=##u89+.;;,::::::::::::::::::::::::::::::::::::::::::::::::<<:::::::--<,776<<--:324::::::<<",
+":::::::,::::::::,,,:::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222>>>>>>>>2222222222222222,,,>222222>>>>,,11+9%%kTYkhjhauaiaaiiuuuuuuuut**&&&&&&&&%&**&88%;;;>,2224444444422222222222222222222222222222222222222222222222222222222>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::44444::----:>255--->;--,>>::>>>>::::::::::::::::::::::::::::::::22222222::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>44:::>>>>>>>>>;;;;>>:5434442>>>>::::::::::::::::::::::::::::::::<;-.<7666++98iiuu***uuiiuiuuuiiiytt*&Oo#8%+X.;<,::::::::::::::::::::::::::::::::::::::::::::::::<<::::::::--<<771<.-:32444:::<<-",
+"::::::,,::::::::33,:::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222>>>>>>>>2222222222222222,,,>222222>>>>,,1+69+8JIIkjhhpiaiaaiuq88uuuuuu8***&%%%%%&&8*%%% 222332224444444422222222222222222222222222222222222222222222222222222222>>>>>>>>2222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>22>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::4444::::::223334>--,,>>>>>>>>>>2::::::::::::::::::::::::::::::::22222222::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::>>>2222>55>>::522344222>>>::::::::::::::::::::::::::::::::,,<-<771<..+9yytauuuiaapaiuut8ttte&&O #89+X..;<;::::::::::::::::::::::::::::::::::::::::::::::::<::::::::::---,76..-<324442>>;;;",
+":::::,,,::::::::33,,::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222>>>>>>>>2222222222222222,,>>22222>>>>;,,X+99+hYIJkjiajipiiaiq888u8uuiuuu8**&$#$&%o%*99% 22>:>>222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>222>>>>>>>>>>>>>>>>>>>22>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::44::::::,::44444,-->,::>>22222>:::::::::::::::::::::::::::::::::2222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>-:::::>222222222,,>222:55>>>><;-::::::::::::::::::::::::::::::::-:,:-<<<-...+9yyutttuuuuuuuuuuuu*&#O  &i9+.1;;,-:::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,:--<7+...<,>:442><;;;",
+"::::::::::::::::::::,33,::::::::3333,>>>>>>>>>>>::::::::::::::::::::::::::::,33,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,33::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222233333333>>>>232222>>;,,<+%+98zJKxjaaaiiauiaiu8888uuut8tuuut***&&t*&&99++222>>>>>>>>>>>>>22222222222222222222222222222222222222222222222222222222>>>222222222233333322222>>>>>>>>22>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::444---:>>>>>>>22222::::::::::::::::::::::::::::::::2222222233222:::>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>><<<<<:<>>>>22222<>>>>>>>>>><;;;;::::::::::::::::::::::::::::::::::::::---....698****tttt**eee**&@  o  +9961.;-<,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,:---<+++.;<>:22>>,;-.",
+"::::::::::::::::::::,33,::::::::333,>>>>>>>>>>>>::::::::::::::::::::::::::::,33,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,33::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222233333333>>>>23332>>>;<<<o+%98Jxhkjiappiqquiiu88u88ut8*8uuue**eee**&9996+22>>>>;;>>;>>,,,22222222222222222222222222222222222222222222222222222222>>>222222222233333322222>>>>>>>>22>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::<<<<<<--::::::--::>>>>>>>22222::::::::::::::::::::::::::::::::222222223322::::>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>-----<<;<>>>>>>2;;<<<<<<<;;;;;;;:::::::::::::::::::::::::::::::::::::::---...699&&&&&&&&t*&&&&$$      X661..-;<>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<<<++66..;;>>,,,,;;",
+"::::::::::::::::::::,33,::::::::333,>>>>>>>>>>>>::::::::::::::::::::::::::::,33,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222233333333>>>222332>>;;<<1Oo+%9Yxipapppiuuquuu8888888tt8tuuu****tt&&9996+.>>>><;;;;;;;;,,>22222222222222222222222222222222222222222222222222222222>>2222222222233333322222>>>>>>>>22>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::<<<<<<<<----::>>-:::::::::::::::::::::::::::::::::::::::::::::::222222222222::::>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>------<<<<<<>>>><<<<<<<<<<------::::::::::::::::::::::::::::::::::::::::---;.169&&&&&&&&&&&**$O X  ++XXX...-;<<;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,<< +961.11;,,,,;;,",
+"::::::::::::::::::::,33,::::::::3,,>>>>>>>>>>>>>::::::::::::::::::::::::::::,33,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,::::::::::::::22222222222222222222222222222222>>>22222>>>;<<11Oo+ 9Hzhiapspaiauuuu8888888tuuuuut*****8889966..>>><<;;;;;;;;>>>22222222222222222222222222222222222222222222222222222222222222222222233333322222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::<<<<<<<<---;;;;;---:::::::::::::::::::::::::::::::::::::::::::::22222222222:::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>-----<<<<<<<<:::<<<<<<<<<<<-----::::::::::::::::::::::::::::::::::::::::::,;--17+%&999yy99888&O  +666..X;--;<,;-:::::::::::::::::::::::::::::::::::22:::::::::::::::::::2:::,,<-.+996666.111;-->",
+"::::::::::::::::::::,33,::::::::,>>>>>>>>>>>>>>>:::::::,::::::::,:::::::::::,33,::::::::,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::22222222222222222222222222222222>>>22222>>>;<<11O$%%hcx8jaapsjpiuuuuq88*8**8uuuutt888888y99961;;22:><;;;;;;;>>>>22222222222222222222222222222222222222222222222222222222222222222222233333322222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::<<<<<::::;;;;;;;--::::::::::::::::::::::::::::::::::::::::::::::222222222:::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<::<<<<<<<<<<<:::::::::::::::::::::::::::::::::::<<:::::>:>,;--<,++669999y9966999699611;-<;--;<<;:::::::::::::::::::::::::::::::::::22:::::::::::::::::::32::,,<-++66+++X+661;-:>",
+"::::::::::::::::::::,33,::::::::>>>>>>>>>>>>>>>>:::::,,,::::::::,,,:::::::::,33,::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::33,:::::::::::::2222222222222222222222222222222222>22222>>;;<<11$$%%lcHijpaappaiqquuuq88*==*tuuuutttyy899961<;:>442:>;;;;;;>>22222222222222222222222222222222222222222222222222222222222222222>>2222233333322222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>2:::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>;;;<<<<:::,::::::::::::::::::::::::::::::::::::::::22222222::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>:::::::<<<<<<<::::::::::::::::::::::::::::::::::::::::::::::::<<:::>22>>>>---;..<1666666+.66996661;;;::----<,<:::::::::::::::::::::::::::::::::::22:::::::::::::::::::32:::<<-++++++  +661;>22",
+"::::::::::::::::::::,33,::::::::>>>>>>>>>>>>>>>>:::::,33::::::::33,:::::::::,33,::::::::33,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::33,:::::::::::::222222222222222222222222222222222232222>>>;;;111$$&%cxKxuaspauiiuuqqq888*==*tutti888996611;;-:54444:>:;;;>>222222222222222222222222222222222222222222222222222222222222222222>>>2222233333322222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>22:::::::::::::::::::::::::::::::::::::::::::::::::::::222>>>>>>>;<<<<<<,,::::::::::::::::::::::::::::::::::::::::22222222::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>222:::::::<<<<<<::::::::::::4444::::::::::::::::::::::::::::::::<<<:>>2222>>>>:-----<<<<..;<<<166...;;:2::-::,,;:::::::::::::::::::::::::::::::::::22:::::::::::::::::::42::-<,,.+++oO  +++1;>23",
+"::::::::::::::::::::,33,::::::::>>>>>>>>>>>>>>>>::::,,33::::::::33,,::::::::,33,::::::::33,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::33,:::::::::::::222222222222222222222222222222222232222>>;;;;111O$t%8cxjiappppaiiuq888888==*tut8889%0XXX.;;>2344444:>>:>>>>222222222222222222222222222222222222222222222222222222222222222222>>>2222233333322222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>222::::::::::::::::::::::::::::::::::::::::::::::::444422222>>>>>>><<<<<<<,::::::::::::::::::::::::::::::::::::::::22222222::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>444444:::::<<<<<::::::::::444444::::::::::::::::::::::::::::::::<<<<,>222>:>33>-,::::---<<<-..<61..;,-:2:::23,;-:::::::::::::::::::::::::::::::::::22:::::::::::::::::::::::-<37X+++oOO@@oXX;>22",
+">>>>>>>>:>>>>,33>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,33::::::::::::,33,33333333::::::::::::::::::::::::::::::::::::::::>>>>>>>>,,,,,,,,::::::::::::::::222222222222222222222>>>22222333,,,>22223>;;<...+9o9iiiquiiaaaappiqqu888****8tttf7>>2>>3222>>>>>22>>>>>2222222222222222222222222222222222222222222222222222222223333322222222222222222222222233333333222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,:::::::::::::::::::::::::::::::,>>>>>>:>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::442222>>;;;;-<,,,::-:>>>>>;;::::::::::::::::::::::::::::::::;;;<,>>>2222>>>><<<;;;;;;;--:337oo+&+699..;>>>22",
+">>>>>>>>>>>>,,33>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,33::::::::::::,33,33333333::::::::::::::::::::::::::::::::::::::::>>>>>>>>33333333::::::::::::::::222222222222222222222>>>22222333,,,>22222>;<1...%+ yc88qiiiaaapppiiq88888*&&88iif7>>2>>322>>>>>>22>>>>>2222222222222222222222222222222222222222222222222222222223333322222222222222222222222233333333222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,:::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::442233>>;;;;--<<,,>::>>>>>;;::::::::::::::::::::::::::::::::;;;<,>>>2222>>>><<:<;;;;;;,,::--oo+99996.;;>>>22",
+">>>>>>>>>>>>,,33>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,::::::::::::,33,33333,,,::::::::::::::::::::::::::::::::::::::::>>>>>>>>33333333::::::::::::::::2222222222222222222222>>22222233,,,>2222>>,11..69%%ixhi8iiiaaaaaiiiiuutt889988ii73>>3>>22>>>>>>>2>>>>>22222222222222222222222222222222222222222222222222222222223333222222222222222222222222233333333222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,:::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::42233,,;;;;...;,,,:->>>>,,<::::::::::::::::::::::::::::::::;;;<,>>>222>>>>>::::;;;;;;;;;<<<  +99991.;;>>>22",
+">>>>>>>>>>>,,333>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,::::::::::::,33,333,,,,:::::::::::::::::::::::::::::::::::::::::>>>>>>>>,,,,,,,,::::::::::::::::22222222222222222222222222222222,,,>2222>>,,;.16998hkji8uuiiaiaaqiiiiii8888yy88972>>2>>>>>>>>>>>>>>>>>2222222222222222222222222222222222222222222222222222222222222222222222222222222222222223333333322222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,::::::::::::::::::::::::::::::::>>>>>>,>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2>3,,<<;;;....11<--:>>::::::::::::::::::::::::::::::::::::;;;<>>>>222>>>>>:::::;;;;;;11116XX+9666.;;->>>22",
+">>>>>>>>>,,,,333>>>>>>>,>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,::::::::::::::::::::::::::::::::::::::::::::,33,333,,:::,:::::::::::::::::::::::,:::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::22222222222222222222222222222222,,,>22222,,<..669%9xhi=uiuiiiiiiuiiiii8 %99999663>>>2>>>>>>>>>>>>>>>222222222222222222222222222222222222222222222222222222222222222222222222222222222222222223333333322222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,::::::::::::::::::::::::::::::::>>>>>>,>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>;<<11.+..111;---::::::::::::::::::::::::::::::::::::::;;;,>>>>22>>>>>>44:::;;;..1661..++69611.;;;>>>22",
+">>>>>>>>,,,33333>>>>>,,,>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::::::,33,33,,::::,,,:::::::::::::::::::::,,,:::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>22222233222222,,,>22223,;;..66+ %hhjquiiiiiiiiquiiah8 XX111111>>>>>>>>>>>>>>>>:>>2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222223333333322222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,:::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222::>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>-;;;;...++++61..--::::::::::::::::::::::::::::::::::::::;;;,>>>>22>>>>>>444::;;..XX...+666771;<;;;>>>>22",
+">>>>>>>>33333333>>>>>,33>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,33::::::::::::::::::::::::::::::::::::::::::::,33,33,,::::33,:::::::::::::::::::::33,:::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>2222233322222,,,>22223>;<<;16 +yihkjqaaaaiiuuwuaiphi+XX....;;>22>>>>>>>>>>>>>:>>2222222222222222222222222222222222222222222222222222222222222>>>222222222222222222222222223333333322222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,:::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222:::>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>><;;;..XXo+%6+...--::::4:::::::::::::::::::::::::::::::::;;<,>>>>2>>>>><<444::;...XX+++691;1<--;-;>>>>>22",
+">>>>>>>>33333333>>>>,,33>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,33::::::::::::::::::::::::::::::::::::::::::::,33,33,:::::33,,::::::::::::::::::::33,,::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>2222233322222,,,>22222>;<11.1XXlhh*iapaaaaiuuwaaiih8+X11111;;>33>>>22>>>>>>>>::>2222222222222222222222222222222222222222222222222222222222222>>>222222222222222222222222223333333322222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,:::::::::::::::::::::::::::::::,>>>>>>:>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222:::>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>,<;;.XXX +&9+...--:::44:::::::::::::::::::::::::::::::::;;<>>>>>2>>>>><<444:<;.XX+9yy9++,----<,-::>>>222",
+",,,,,,,,3333>>>>,,,>>>>>,,,,,,,,::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::33,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,33::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>,,33,>>>>>>:::::::::::::::::2222233322222222>>>2222222222222,,,>22223,,;;..1XXllhiiiappppaaauauuihi96fg7;;>;>>>>>>>>>>>>>>>>2222222222222222333333332222222222222222222222222222222222222222222222222222222222222222222222222222222222222222>>>>>>>2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::222::222::::::::>>>>>:::::>>>222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>><;;...XX +99+...;-:::444::::::::::::::::::::::::::::::::<<>>>>>2222>,,<;433:<.X+X6yy9+XX,,,,,,,,>>>>2222",
+",,,,,,,,>,3,>>>,,,,>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::33,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,33::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>,33>>>>>>>>::::::::::::::::2222233322222222>>>2222222222222,,,>22223,,<;...+9cciihpiaappaaiaaaiiii96ff7,332>>>>>>>>>>>>>>>>2222222222222222333333332222222222222222222222222222222222222222222222222222222222222222222222222222222222222222>>>>>>>2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::222::222::::::::>>>>>:::::>>>222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>><;;;...X +66+..;;-:::444::::::::::::::::::::::::::::::::<<>>>>>2--:,,,;-:2,,111+99996+XX,,,,,,,,>2222222",
+",,,,,,,,>>,>>>,3>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>,,,>>>>>>>>::::::::::::::::2222223322222222>>22222222222222,,,>22222,,<;...Xhlxi8qqiiaapaaapspaii891773>222>>>>>>>>>>>>>>>>2222222222222222333333332222222222222222222222222222222222222222222222222222222222222222222222222222222222222222>>>>>>>2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::222::222::::::::>>>>>>::::>>>222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>;;;...XX++...-;:::::44::::::::::::::::::::::::::::::::>>>>>>22733>----,<.X.9hc996++1..,,,,,22222222222",
+">>>>>>>>>,3,>>,3>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>,:>>>>>>,::::::::::::::::22222222222222222222222222222222,,,>22222,,<;...9xlli8ijaaaappppsspaii991;;>>>>3>>>>>>>>>>>>>>>>2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222233222222>>>>>>>2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::222::222::::::::>>>>>>>>>>>>>222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>;;;;;XX..;;;->:::::::::::::::::::::::::::::::::::::::>>>>>>22::::<<,1<X.9cxh999996..<:::::::2::::::::",
+">>>>>>>>3333>>>,>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>:>>>>>>,::::::::::::::::22222222222222222222222222222222,,,>22222,,<;...6cczxhiiaaaapjjjsaaii89.1;>32>27>>>>>>>>>>>>>>>>2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222233322222>>>>>>>2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::222::222::::::::>>>>>>>>>>>>>>22::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<::::>>2>>>>;;;...;;;<>>>22::::::::::::::::::::::::::::::::::::>>>>>222-->3,;-.X1gllcy+99996--:::::::::::::::::",
+">>>>>>>>3333>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::3322222222222222222222>>>>>>>>>>,,,>22222,,<;...9cxxciujaaaappjjsaaii86X1,,3>:>3>>>>>>>>>>>>>>>>22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222333222>>>>>>>>>2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::222::222::::::::::>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<<:::>22222>>>>;;;;:>2222222>>>::::::::::::::::::::::::::::::::>>>>>22233,--;7799hh9%8y961<,344::::::::::::::::",
+">>>>>>>>>>,>>::>:::>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::333222222222222222222>>>>>>>>>>>,,,>22223,,<;...6cKHxhiaaaaaapsjspaii86.;;,>>>>:>>>>>>>>>>>>>>>>22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222333222>>>>>>>>>2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::222::222:::::::::::>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<<:::>222222>>>-:::::2322222>>>::::::::::::::::::::::::::::::::>>>>2222>---;7glh98iyiyoXXX.-444::::::::::::::::",
+">>>>>>>>-:>::::>:::>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>,>>>>>>:::::::::::::::::333222222222222222222>>>>>>>>>>>,,,>22223,,;;..19hHxzzjiaaaaaapjsauqq91;;1,>,33->>>>>>>>>>>>>>>>22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222333222>>>>>>>>>2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::222::222:::::::::::>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<<:::>2222222>>-:2:::434222>>>>::::::::::::::::::::::::::::::::>>>>2222:>337fghh8hhyy8 X.11:444<:::::::::::::::",
+">>>::>>>>>>>>>>>::::::::::::::::::::::::::::::::::::,,33::::::::::::::::::::::::33,,::::::::::::::::::::::::::::::::::::::::::::::::,,33::::,,33333,::::::::,33,::::::::::::::::::::::::33,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>2222222222222>>>;;>>>22>1X16XX+9xcchh8iiaiiappppgg7734434422,,;;22222>>>>>>22222222222222222222222222222222222222222222222222222222222222222222233333333222222222222222222222222222222222222222222222>>>22222333>>>>>>>>>>>>>>>>>>>>>>>>22222222::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::>,,>>>>3>>>>>:::>>>>>>>>::::::::::::::::33::::::::::::::::::::::::::::::444444444444444422>>>>>>222>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222>;..669yhkpuii861;;<::<<:::::::::::::::::",
+">>>::>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::,33::::::::::::::::::::::::33,::::::::::::::::::::::::::::::::::::::::::::::::::,33:::::,3333,:::::::::,33,::::::::::::::::::::::::33,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>2222222222222>>>;;>>>22>7;.XX+ 98hii8qiuaaaaaaap97,:::::4422,,,;22222>>>>>>22222222222222222222222222222222222222222222222222222222222222222222233333333222222222222222222222222222222222222222222222>>>22222233>>>>>>>>>>>>>>>>>>>>>>>>22222222::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::>>>>:>>>>>>>:::>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::444444444444444422>>>>>>222>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222>>;69999ykjppi91.;;>::<<<::::::::::::::::",
+">>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::,,,:::::,,,3,,:::::::::,33,::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>22222222222222>>;;>>>>>>>1..66XyKzczci8aapppauuu1..<,,:44422>,,,22222>>>>>>22222222222222222222222222222222222222222222222222222222222222222222233333333222222222222222222222222222222222222222222222>>>22222223>>>>>>>>>>>>>>>>>>>>>>>>22222222::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::-:>>>:::>>>>>>::>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::444444444444444422>>>>>>222>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222>>;699699=&8891.;;>>:::<<::::::::::::::::",
+">>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::,::::::::::::::::::::::::,::::::::::::::::::::::::::::::::::::::::::::::::::::::,:::::::,,:::::::::::,33,::::::::::::::::::::::::,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>2222222222222222;>>>>>>>;;.66X9xKKHliiuiaappauuq1XX.1,,32222>,,,22222>>>>>>22222222222222222222222222222222222222222222222222222222222222222222233333333222222223322222222222222222222222222222222222>>>>>222222>>>>>>>>>>>>>>>>2222222222222222::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>->,3>>::>>>>>>>>>>>>>>>>::::::::::::::::::,33,::::::::::::::::::::::::::444444444444444422>>>>>2222>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>222>>;;11+69&%%+.X.;>>>::::<::::::::::::::::",
+">>>>>>>>>>>>>>>>::::::::::::::::::::::::,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,::::,33,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,>>>>>>>>>>>>>>>>2222222222222222>>>>>>>>11X.XXLWzzHxhiiaaaappaaq6+XX.;;>,222,>,,22222>>>>>>22222222222222222222222222222222222222222222222222222222222222222222233333333222222223332222222222222222222222222222222222>>>>>>22222>>>>>>>>>>>>>>>>2222222222222222::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:>33,>>>>>>>>>>>>>>>>>>>::::::::::::::::::,33,::::::::::::::::::::::::::44444444444444442>>>>>22222>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>22>>--...666++...;3>>::::::::::::::::::::::",
+">>>>>>>>>>>>>>>>::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,3::::,33,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,>>>>>>>>>>>>>>>233333333>>222222>>>>>>>>;1.X.y[IFcLR[Bpapaapssaai896611,,22222>>22222>>>>>>2222222222222222222222222222222222222222222222222222222222222222222222222222222222222333222>>33333333222222223333333322222>>>>>>>2222>>>>>>>>>>>>>>>>2222222222222222::::::::::::::::,,>>>>::>>>>>>>>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::>>>>>>>>33,>>>::>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222>>>>>>>,>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;:>>>>>>>>>;;111XXX.-;,3>:::::::::::::::::::::::",
+",>>>>>>,>>>>>>>>::::::::::::::::::::::::33,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,33::::,33,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,33>>>>>>>>>>>>>>2233333333>>>22222>>>>>>>>-1..6xRKFlc8ikjjsssssspphiii996,,,22222222222>>>>>>2222222222222222222222222222222222222222222222222222222222222222222222222222222222222333222>>33333333222222223333333322222>>>>>>>>222>>>>>>>>>>>>>>>>2222222222222222::::::::::::::::,,>>>>::>>>>>>>>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::>>>>>>>,>>>>>:::>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222>>>>>>>,>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;::>>>>>222,,<;.,,,,,::-44::::::::::::::::::::::",
+",>>>>>>,>>>>>>>>::::::::::::::::::::::::33,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,333::::,33,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,33>>>>>>>>>>>>>22233333333>>>22222>>>>>>>;11X66xNWzW)Ikkpksssspapphphhv91-,,22222222222>>>>>>2222222222222222222222222222222222222222222222222222222222222222222222222222222222222333222>>33333333222222223333333322222>>>>>>>>222>>>>>>>>>>>>>>>>2222222222222222::::::::::::::::,,>>>>::>>>>>>>>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::>>>>>>>>>::>>:::>>>>>>>>>>>>>::::::::::::::::::::::33::::::::::::::::::::::::2222222222222222>>>>>>,,>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;::>>>>422>:->>;----::43444::::>::::::::::::::::",
+">>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,33::::::::::::::::::::::::::::::::::::::::::::::::33,,::::::::,33,::::,33,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>222>>>>>>>>2222222222222222>>>>,,,;1.16yhyzWRTIzkjsjspsssjjhhiy961,,,222222222222222222222222222222222223332222222222222222222223333332222233333333233322332222222222222222>>>222222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>>>>2222222222222::::::::::::::::>>>>>>>>>>>>>>>>3,,:::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::-3-3--X7::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::-::>>>>5222>>>>>::::4444444::>>>::::::::::::::::",
+">>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,33::::::::::::::::::::::::::::::::::::::::::::::::33,:::::::::,33,::::,33,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>222>>>>>>>>22222222222222222>>>,,,;;176yxHWKLHxkjsssasssppphi891..;,2222222222222222222222222222222222223332222222222222222222223333322222222222222233322332222222222222222>>>222222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>>>22222222222222::::::::::::::::>>>>>>>>>>>>>>>>,,::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3:,3-37>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>24::::::4444444444:::>>>::::::::::::::::",
+">>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::,,,:::::::::,33,::::,33,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>222>>>>>>>>2222222233333333222>,,,;169ghK[RFNBhiwsksasjsppii9+...;,2222222222222222222222222222222222222333222222222222222222222233322222222222222223332223>>>>>>>>22222222>>>222222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>>2222222>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::--,77--->>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>24::::::44444444:::::>>>::::::::::::::::",
+">>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,::::::::::::::::::::::::::::::::::::::::::::::::,:::::::::::,33,::::,33,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>222>>>>>>>>2222222233333333222>,,;;16gzlH'}WHxhjsjsssssaaiu61X.11,32442222222222222222222222222222222222333222222222222222222222222222222>>>>>>>>>>223322232222222222222222>>>222222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>2222223322222222::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::--,gFg-7>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>:22::::::44444:::::::::::::::::::::::::::",
+">>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,33,::::,33,:::::::::::::::::::::::::::::::::::::::::::::::::::::::,::::::::::::::::::::::::>>>>>222>>>>>>>>2222222222222222222>,,;;.6cLcl_RJHxkapsjsaaaiii861.1,,::4442222>2222222222222222222222222222233322222222222222222222222222222>>>>>>>>>>>22332>233333333322222222>>>222222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>2222233333333333::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3--gWSgg,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>:,:::::::444:::::::::::::::::::::::::::::",
+">>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,33,::::,33,:::::::::::::::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::>>>>>222>>>>>>>>2222222222222222222>,,;;.6glcz_WINihpksssaaaiiy971;,,444444422>>222222222222222222222222222223332222222222222222332222222222>>>>>>>>>>>>>2322>2333333333>>>>>>>>>>>222222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>2222333333333333::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,X-7ggf7<<<<<<<<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22>>>>:,,:::::::222>>>>><<:<<<::::::::::::::::::",
+">>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::33,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,33,::::,33,:::::::::::::::::::::::::::::::::::::::::::::::::::::,33::::::::::::::::::::::::>>>>>222>>>>>>>>2222222222222222222>,,;;166gcK}LHzkjpsssaaai889+,;-:4443444422>>22222222222222222222222222222333222222222222222233322222222>>>>>22222222>232>>2233333333>>>>>>>>>>>222222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>2223333333333333::::::::::::::::>>>>>>>>>>>>>>>>::::::,,::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,77X-,-<<<<<<<<::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::32>>>>,,,:::::::>>>>>>>>;;;<<<<<::::::::::::::::",
+">>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::33,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,33,::::,33,::::::::::::::::::::::::::::::::::::::::::::::::::::,,33::::::::::::::::::::::::>>>>>222>>>>>>>>2222222233333333222>,,;;179gcLRWJxkjkpauaaa8#o+X--234444444422,>22222222222222222222222222222333222222222222222233322222222>>>>>22222222>222>>2222222222>>>>>>>>>>>222222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>2223333322222222::::::::::::::::>>>>>>>>>>>>>>>>:::::,,3::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::-,X<,3-7;;;;;;;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::32>>>>,,,:<:::::>>>>>;;;;;;<<<<<::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::,,33::::::::::::::::33,,::::::::::::,33,::::333,::::::::::::::::::::::::::::::::::::::::::::::::,,33::::,33,::::::::::::::::33,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222222222222,>>>>222>31gcxYRJVsjaauwwii91<,-<<<,,,,>>,,,,,<<;;1;.XX.XX..;;;;>>>>>>>>>>>>>>>>>>>>>222>>>>>>>>>>>>>>>>>>>>>>>>,,,,,,,,>>>>>,,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>222223332222222233322222222222222222233333333333>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::22222222222::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>-:,,::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>::>>3377>:>,>:::::::::::::::::::::::::::::::::",
+":::::::::::::::::::::::::::::::::::::::::::::,33::::::::::::::::33,:::::::::::::,33,::::33,::::::::::::::::::::::::::::::::::::::::::::::::::,33::::,33,::::::::::::::::33,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222222222222,>>>>222>Xfl9hWLuauaauupw8y891<-<<,,,>>222>,,,,,7,;;661X11..;;,,>>>>>>>>>>>>>>>>>>>>>222>>>>>>>>>>>>>>>>>>>>>>>>,,,,,,,,>>>>>,,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>222223332222222233322222222222222222233333333333>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::22222222222::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::,::::,::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>::>>,373::>,>>::::::::::::::::::::::::::::::::",
+":::::::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::,,,:::::::::::::,33,::::3,,::::::::::::::::::::::::::::::::::::::::::::::::::,,,::::,33,::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222222222222,>>>>2223>ffX+xNchuikpquu*8h96<<,,,>222222222>>,3;;79g969961;;;;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,,,,,,,>>>>>,,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>222223332222222233222222222222222222233333333333>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::22222222222::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>,,,::::3::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>,3>:-->,>>::::::::::::::::::::::::::::::::",
+":::::::::::::::::::::::::::::::::::::::::::::::,::::::::::::::::,:::::::::::::::,33,::::,::::::::::::::::::::::::::::::::::::::::::::::::::::::,::::,33,::::::::::::::::,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222222222222,>>>>222:7fg99hx89iipquai88h961<>>22222444422222-,779fggg971;;;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,,,,,,,>>>>>,,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>222223332222222222222222222222222222233322222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::222::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>:::::::,::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>,::-:>>>:::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,33,:::::::::::,,::::::::::::::::::::::::::::::::::::::,::::::::::::,33,:::::::,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222222222222,>>>>2223-7f96gllhxlhiiuq88y99612222244444444222>377117911;;;;>2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,,,,,,,>>>>>,,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>222223332222222222222222222222222222233322222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::222::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,33,:::::::::,,3,,,::::::::::::::::::::::::::::::::::,,,::::::::::::,33,:::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222222222222,>>>>2222>-.6.6zzghh8hi888889996>22222444444442233>;;;;;...-;>>2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,,,,,,,>>>>>,,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>222>>>>>>>>22222233222222222222233322222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::>>>>>>>>:::::::::::::::::::::::::::::::::::::222::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>3:::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,33,:::::::::,3333,::::::::::::::::::::::::::::::::::,33::::::::::::,33,:::::,33::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222222222222>>2>2222-77;f96lFzxh98 %88888iy9,,,>2222444222223>>>,1;;;;;;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,,,,,,,>>>>>,,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>222>>>>>>>>22222333222222222222233322222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::>>>>>>>>:::::::::::::::::::::::::::::::::::::222::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>773:::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>:>>>>>>>>::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,33,::::::::,33333,,::::::::::::::::::::::::::::::::,,33::::::::::::,33,::::,,33::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222222222222222222222222222222>22223-,;;9fgxxchcx0 i88uihi*<<<,,>2222222222>233>-;;;;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,,,,,,,>>>>>,,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>222>>>>>>>>22222333222222222222233322222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::>>>>>>>>:::::::::::::::::::::::::::::::::::::222::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>f73:-:::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>,,>>::>>>::>,::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::::::::::33,,::::::::::::::::::::333,::::,,,::::::::::::::::::::::::::::::::::,,,,,,:::::::::::::::::::::::::::::::::::::::::::::::::::,,:::::,33::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>22222222222222222222222222222222:,3;.;7fLLxlFl+  &8tuait61..;<,3>>2,,,,>333>,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>333,>---:-77->3->>>>>>>>>>>>>>>>2>>>>>>>>>>>>>>>>>>>>>>>,,,,,,,,22222222222222223332222222222>>>>>>>>>>>>>>>>>>>>>>::>>>3,>>>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::22222222::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::,>>::>>,>>>>>>>>::::::::::::::::>>>>>>>>3,,>>>>>::::::::::::::::>>>>>>>>>>>::>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>::::>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::::::::::33,:::::::::::::::::::::33,:::::,,,::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::::,,33::::,333::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>22222222222222222222222222222222>,,;-;17hxlllh98%yit&*tt996;..--;;;,,,<<322>>>>>>>>>>222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3--7gcgf7--,3-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,,,,,,,22222222222222223322222222222>>>>>>>>>>>>>>>>>>>>>>::>>>3,>>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::22222222::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>::>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::3,,:::::,,:::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::::,333:::,,333::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>22222222222222222222222222222222>>>;;;;-X69hxzNHlchihkp*gg9661;.<<;;;;;;2>>>>>>>>>>>>>>2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,33,7gSWlg3-3:-3>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,,,,,,,22222222222222223222222222222>>>>>>>>>>>>>>>>>>>>>>::>>>3,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::22222222::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>::>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::::::::::,:::::::::::::::::::::::,::::::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::,,,::,,3333::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>222222222222222222222222>>>>,,;-1.19cxFFLWWLxciygy9966111,<;---->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>->33--XXDlf->3>>>>>>>>>>>>>>>>>>>>>>>>>2>>>>>>>>>>>>>>>>>>>>>>>>2222222222222222222222>>22222>>>>>>>>>>>>>>>>>>>>>>::>>>,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::22222222::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>:::>>>>>::::::::::::::::>>>>>>>>>>>::>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>,33,>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::,::::::::::::::::::::::,,::::::::::::::,::::::::::::::::::::::::,,,,,,,,:::::,,,,,,,,,,,,,,,,,,,::::::::::::::::::::::::::::::::::::::::::,,,,33::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,,,,,,,,,,,,,,222222222222222222222222>>,,,,>>7;1117gg1hzxg99y996611<;,,>;--;;>>>>>>>>:::----->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3---,7733f7-33-->>>>>>>>>>>>>>>>>>>>>>>2>>>>>>>>>>>>>>>>>>>>>>>>222222222222222222222>>>22222>>>>>>>>>>>>>>>>>>>>>>::>>>,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::22222222::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>:::>>>>>::::::::::::::::>>>>>>>>>>>::>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>,33,>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::,,,::::::::::::::::::,,,,,,::::::::::,,3::::::,,::::::::::::::::33333333:::::,,,,,,3333333333333::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,,,,,,>>>>>>>>222222222222222222222222>33>>->>.-;;-;377fgf96+X61...;;->>>>>>23,,,>>>>>:------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>->73>-:3--:,3--,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>22222222222222222222>>>>22222>>>>>>>>>>>>>>>>>>>>>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::22222222::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>::>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::33,::::::::::::::::::,3333,::::::::::,33:::::,,,::::::::::::::::33333333:::::,,,:::,,333,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>222222222222222222222222333>>>>>15523325->3,;1166;..;;;>>>222222,,,,>>>>>>>><<<<>>>>>>>>>>>>>>>>222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>,>--7,,3-->3>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>2222222222222222222>>>>>22222>>>>>>>>>>>>>>>>>>>>>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::22222222::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>::>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::33,,::::::::::::::::,,3333,,::::::::,333:::::,,,::::::::::::::::,,,,,,,,:::::,,,:::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>22222222222222224222222232>2333252>52243432>;;111;..;>>>3333222>,,,,,,>>,,,,,,<<>>>>>>>>>>>>>>>>222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:>,,>>,3::,--77->>>>>>>>>>>>>>>>2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>2222222222222222222>>>>>22222>>>>>>>>>>>>>>>>>>>>>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::22222222::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::>>,,>>:>>>>>>>>::::::::::::::::>>>>>>>>3,,>>>>>::::::::::::::::>>>>>>>>>>>::>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>::::>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::",
+":::::,33:::::::::::::::::::::,33::::::::::::::::::::::::::::,,33::::::::::::::::::::,33,33,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3333,:::>>>>>222>>>>>>>>>>>>>>>>>>>>>>>>222222222222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>2>>>>>>>222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>33,773->3->>>>,3,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3,,:::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+":::::,33:::::::::::::::::::::,33:::::::::::::::::::::::::::::,33::::::::::::::::::::,33,33,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::333,::::>>>>>>22>>>>>>>>>>>>>>>>>>>>>>>>222222222222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>2>>>>>>>222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3333773:>>>>>>,3,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+":::::,33:::::::::::::::::::::,33:::::::::::::::::::::::::::::,,,::::::::::::::::::::,33,,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::333,::::>>>>>>>2>>>>>>>>>>>>>>>>>>>>>>>>222222222222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>2>>>>>>>22>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>233>377>-3>>>>,3,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+":::::,,,:::::::::::::::::::::,,,:::::::::::::::::::::::::::::::,::::::::::::::::::::,33,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3,,:::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>22222222222222222222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>22>:>773->>>>>,3,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+"::::::,,::::::::::::::::::::::,,:::::::::::::::::::::::,::::::::::::::::::::::::::::,33,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,::::::::::::::::::::::::::::::::,:::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>22222222222222222222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3->77,->>>>,3,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+":::::::::::::::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::,33,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>22222222222222222222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,,,,,,,,,,,,,,,>>>>>>>>>>>>>>>>2>>>>>>>>>>>>>22>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,7-:ff3:>>>>,3,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+":::::::::::::::::::::::::::::::::::::::::::::::::::::,33::::::::::::::::::::::::::::,33,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,33::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>22222222222222222222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,,,,,,,,,,,,,,,>>>>>>>>>>>>>>>>2>>>>>>>>>>>>222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3-3f7-3>>>>,3,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::,,33::::::::::::::::::::::::::::,33,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,33::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>22222222222222222222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,,,,,,,,,,,,,,,>>>>>>>>>>>>>>>>2>>>>>>>>>>>>222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>->-7f7-3>>>>,3,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,3>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,3333,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>222>>>>>>>>>>>>>22233333222222222222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>22>>>:>,333,>3333,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>33>>>>>>>>>>>>>>>>>>>>>>>2:7ff73>>-:>>>,,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,3333,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>222>>>>>>>>>>>>>22233333222222222222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,333333333,>>>>>>>>>>>>>>>>>>22:>>>>>>>>>>>>>>>>>>>>>23>>>>>>>>>>>>>>>>>>>>>>22>3773>>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,33,,,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>22>>>>>>>>>>>>>>22333333222222222222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>33,>>>,3333,>>>>>>>>>>>>2>>>::>>>>>>>>22>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>22222>>>>>,>:::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,333,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>33333333222222222222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,>>>>>>3,,>>>>>>>>>>>>>2>>>>>33>>>>>>>>>>>>>>>>>>>22>>>>>>>>>>>>>>>>>>>222>>>>>>::::>>:>>>>>>>:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::,,,,,,,,:::::::::,,,,333::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>33333333222222222222222222222222>>>>>>>>>>>>>>>>22>>>>>>>>>>>>>>>,333,>:,>>>>>>>>>>>>>>>>>>>37773332>>>>>>>>>>>>>>>2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::>>,>:>>>>>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::33333333::::::::,,,33333::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>22>>>>>>>>33333322222222222222222222222222>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,33333,>>>>>>>>>>>>>>>>>>>>>23373332>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,33>>>>>>>>::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::33333333::::::::33333333::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>222>>>>>>>>33333222222222222222222222222222>>>>>>>>>>>>>>>>>>>>>>>2>>2222>>>,333333>>>>>>>>>>>>>>>>332>>--->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+"::::::::::::::::::::::::::::::::::::::::::::::::,,,,,,,,::::::::33333333::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>222>>>>>>>>33333222222222222222222222222222>>>>>>>>>>>>>>>>>>>>>223>>3333>>>>::>>,3>>>>>>>>>>>>>>>>>>233322>>>>>>22>>>>>>>>2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>2>>>:--:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::",
+"::::::::::::::::,33,:::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222222222222222222222222222222223332222233333222,,,,,33332233333333,,::::-,,->3>434:3<--7ll7334:332>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,,,,,,,22222222>>>>>>>>2222222222222222>>>>>222222222222222222222222222::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<<<<<<<::::::::<<<<<<<<<<<<<<<<<<<<<<<<:::::>>>,,,:::::::::::::,,,:::::::::::::::::::::::::::::>>>>><<<;;;;;;;;222244444422>>>>::::::::444444444334433:>:::<<<<>>>>>>>>>>>>>>>>::::::<<<::::444444422::::::<<<<<<<<<<<<<<<<<<<<;<::<::::::<::<;;;;;;;;;;;;;;;;;2222222222222222>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+"::::::::::::::::,33,:::::::::,,,,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222222222222222222222222222222223332222233333222,,,,,33332233333333,,::::--->3733777fffff,-;--33>>>>>>>:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,,,,,,,22222222>>>>>>>>2222222222222222>>>>>222222222222222222222222222::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<<<<<<:::::::::<<<<<<<<<<<<<<<<<<<<<<<<:::::>>>,,,:::::::::::::,,,:::::::::::::::::::::::::::::>>>>>><<<;;;;;;;2222244::::>>>>>::::::::2222222222242223>:::::<<>>>>>>>>>>>>>>>>::::::<<<::::444444422:::::::<<<<<<<<<<<<<<<<<<<<::::::::::::::<;;;;;;;;;;;;;;;;22222222>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+"::::::::::::::::,33,:::::::::,,,33333333::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222222222222222222222222222222223332222233332222,,,,,33332223333333,,:::-,337>--:37fgf,X-17,373->:--:>23>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,,,,,,,22222222>>>>>>>>2222222222222222>>>>2222222222222222222222222222::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<:::::::::::::::<<<<<<<<<<<<<<<<<<<<<<<:::::::>>,,,:::::::::::::,,,:::::::::::::::::::::::::::::>>>>>>><<<<<<;;;>>>>::::::::<<<;::::::::::::::::2>>22::22,,,,,,,>>>>>>>>>>>>>>>>:::::::<:::::4444444422:::::::::::::::::::::::::::::::::::::::::<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+",:::::::::::::::,33,:::::::::,,,,,,,,,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222222222222222222222222222222223332222222222222,,,,,33333222333333,,::>-3>->-,f73--;;;1X1XXf7-glcg73>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,,,,,,,22222222222222222222222222222222>>>22222222222222222222222222222::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::,,,:::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>:::::::::<<<;;<<<<<<<<::::::::>>222>>:2,,,,,,,>>>>>>>>>>>>>>>>::::::::::::::4444444222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+"3,,:::::::::::::,33,:::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222222222222222222222222222222223332222222222222,,,,,333333222223322,,>>,,>,3,,7-,71;XX1fchlWD7flcg73>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>22222222222222222222222222222222>>222222222222222222222222222222::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,:::::::::::::,,,:::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::<<<<<<<<<<<<<<<<<<<<<<<<<>33--33>>>>:::::>>>>>>>>>>>>>>>>4:::::::::::::4444444422::::::::::::::::::::::::::::::::::::::::::::::::::::::::<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+"333,::::::::::::,33,:::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222222222222222222222222222222223332222222222222,,,,,333333333322222,,,,7--33,,-71;;7fhlWLc7>77->:--:>23>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>2222222222222222222222222222222222222223222222222222222222222222::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222::::::::::::::::::::::::222>>>::::::::::,,,:::::::::::::,,,:::::::::::::::::::::::::::::>>>>>>>>>>>22222::::::<<<<<<<<<<<<<<<<<<<<<<<<<<,,;-->,>>>>:::::>>>>>::::::>>>>>4:::::::::::::::44444422:::::::::::::::::::::::::::::>>>>>>:::::4444444444444444::::::::::::::::<<<<<<<<<<<<<<<<::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+"333,::::::::::::,33,:::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222222222222222222233322222>>>22222,,,,,33333333333222,,>,,3X,7;1ggX;9cSHHLHlxSxg7->>>>>>>:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>2222222222222222222222222222222222222233222222222222222222222222::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222>>>>>>>>444444444444444422222>>>>:::::::,,,:::::::::::::,,,:::::::::::::::::::::::::::::>>>>>>>>>2222222::::::<;;;<<<<<<::::::::::::::::;-1771->>>222444>>>>::::::::>>>>222>>>>>>>>>>>>>22222222>>>>>>>>::::::::::::::::4:::>>>>>>>>:::44444444444444444::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+"3333,:::::::::::,33,:::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2222222222222222222222222222222233322222>>>22222,,,,,3333333333322>>>,,,-1lSg1976glSzllSchffch7;332>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>2222222222222222222222222222222222222333222222222222222222222222::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::22222222>>>>>>>>::::::::::::::::22222>>>>>::::::,,,:::::::::::::,,,:::::::::::::::::::::::::::::>>>>>>>>2222222244:::>>>><<:::::::::::::::::::::1.9cc7-,,,,22222>>>>::::::::>>>>>>>>>>>>>>>>>>>>22222222>>>>>>>>::::::::::::::::4::>>>>>>>>>>::4444444444444444422222222::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,:::222223332222222233333333333222223333333333333333333,,>>>7--3>>3>7-7,3-1;-7g91gcccLHLSxS9.--;;;>>>>>>>>>>>>>>>>>>222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222233333,:::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::22222::::::::::::::::22222222222222222222::23-::77:::3>>,,>>3,>--:333325->33>>,3333,:::3332::22222222333,,:::::::::::::::::::::::::::>>:>33322>5:333:4444>>,>,,>-::333:::43:::33:33--9hSxf.;1---77-:>2>>7f7::33::::>>73>>33,-3---<,,,-3333:->:::-:>3333,,::::,3,--:3:4:37>;;;-;333::3:73:33:3-:34::2332::23333:::::::44:4333:434-4444:::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,:::222223332222222233333333333222223333333333333333333,,>>>-73-;,--->,X1;;;17hcxLHSLzzSlSxX;;;>>>>>>>>>>>>>>>>>>>>>222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222233333,:::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::22222::::::::::::::::22222222222222222422335-37---->,73,>-->3X;77>---->3333:-::----:,::2322::::::::::,,::::::::::::::::::::::::::::::2>>>232>:233>::2444423>;->773:--33344:::44--443fxxFFlg7X17---37>->--fg7----33733>>>---->;,11,..;,,-->,>3,37732:----:::33-:3773--::----;17.X--::3-,>:>>>373::>>>:::232-52222332544333:-:4-::4334:::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222222332222222233333333332222223333333333333333333,,>>>3--,,<,7X77;gg6X7gxHWKzxHxzFLSg113332>>>2>>>>>>>>>>>>>>>222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222223333,:::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::22222::::::::::::::::22222222::::::::42322237-3>-77>-;......;...XX.;1111;;,77,>>:::332222222222222222::::::::::::::::::::::::::::::::2222222>2>373-->33373;;11;---333-:22237f22233-:fzllzzxh9X1;7glDlgf--,,--3:---;-;-,3,,>,3,;-.XX.;-;;;,;------->373333,>:-7,--::,7-7fglxSLSlhhg7--1;;1;-;,;--;;;;12>>225>3555232222:5:333273325527::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222222222222222233333333222222223333333333333333333,,>>>;7,-,7,-;;X7g71gczLWEYLLnLHzxg.;,,2>2>>>>>>>>>>>>>>>>>>>222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222333,:::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::22222::::::::::::::::44444444::::::::232>--5>37>-,7-,XX6fhcccLLFSzl9XXX;;;;;--:>:::--34::422444444444::::::::::::::::::::::::::::::::322222>>3---,,,73:--X;flLSlf1-:333,>>>,3--->>->fxllxxxlchhgclccghhhclgfg77<--,,1;;;,,,--1-.6fghhDSScf<-,;,33,------;<,,,,-,7,---fxLE`_YEYYWWWFxx1X;71XXXX.797119f7-X--;-7322>;;>2333>->3-->3>5>3::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::222222222222222233333333222222223333333333333333333,,>>,-7--7-X,.gf;XhLHYYLHKYWWHLLl1X7->>222222>>>>>>>>>>>>>>>>222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222233,:::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::22222::::::::::::::::44444444::::::::2>>3773>--,----glxFWR(REER()'[Wxhg91;11,,,,,,2::34::422:::::::::33,,::::::::::::::::::::::::::::22222>>>3----XX.--7gclSWLKLx9..<XX;111;.11;.19gcllxxclxzxxllcgf9cSFFGGGGGGxlhg71;<<;--,7.;7hxFFFSW((Lc7------;37;;--;;;;,--<,7glGWWY(RYE)[)RR(RYSxFWLHLHWW(_(WKW((Llhchg..;;;.;;,---,,;;7;-;;,1-::::::::::::::::::::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::332222222222222233333333222222333333333333333333333,,>>,7X<7X7gf1;XghlKWYYHzNHJLHHHHh17,:2242222:>>>>>>>>>>>>>>>2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222>2222222,:::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::22222::::::::::::::::4444444444444444>22>55,771f7XX7lLLKERTYIYYYYE}}RYFh1XX;1;;---:233:::332:22222222333,,,::::::::::::::::::::::::::44322>>>X7cxcgffhcxLWKJJJJJHlg969ghlxxlcllcclxSFNFLLNFHLxzlllxFFFLFSSGGGGGGFFFFFLLSh7.;1ggclxxxzWWEEEWLLxlhf7;--------;<7fcxDSFWWWFFLE_'TTYKW((WKKR`]))[]`'{]}YW_']RE(_}HFSzlh997111.XXXXX;1X.1.::::::::::::::::::::::::::::::::::::::::::::::::>>>,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,33::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::333222222222222233333333222223333333333333333333333,,>>,-<7-,FEfhh9zWYWHHHNLLHIKIKYWx7X,,4444422>>>>>>>>>>>>>>>>2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222>>222222,:::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::22222::::::::::::::::444444442222222233>>>5---1SLxh77hcxNBBNBKERTERRTSzxcg96;---:::--2::4334:22222222,,,:::::::::::::::::::::::::::::44322>>,-cW(EWWWEWKLHHBBKJJKYEWLKWYEREYWKWKWYWKKRR}}EYWWWKFFLKWKFSSFGGxGGGGGFLWWWWWFlllSFFFzxlxzLLLKWWLLFLLLFxchcccclxSSLLLLFLWWWWWWE__^_^RYYYLSHKY})}R}`[))_}EYYEEWKLLLLLKKKLLKLWRWxhcFlhg61gFF:::::::::::::::::::::::::::::::::::::::::::::::::>,33,>:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,33::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::333222222222222233333333222223333333333333333333333,,>>,;7X7Y(DcSLhzWWKKYHxLJHKHIHRzX;,724444444>>>>>>>>>>>>>>>>2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222>>>22222,:::::::::::::::::::::::::::::::>>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::22222::::::::::::::::44444444333333332--fDFlf;XcSFWSlxBJIKHHJI^[)^RYJxHYRRYKF7ffggf732::4334:--------::::::::::::::::::::::::::::::::44322>,,lL(ELLWWR}}EIKIIPIIIIWWWWWWWKKWWKJJWYWWEEERREEEYYHxLYKLLLLFSGGGGGWWWWLLLLLFFLLFFFFFFNNNFWWWLHFSFFFFFLWE(EWWWLLLLFFFFFWWWWWWER))R^_))))_(YRR_[^ERYEEEYER}RYKWIKLHHHLLLLKYRRR}_}_`KFzzzFl1:::::::::::::::::::::::::::::::::::::::::::::::::>3333>:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::333,>>>:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::::<<<<<<<>>>>>>>>>>>>>>>>4444444422222222:::,,3,,,,,,,,,,33333333>>>>>>>>;;;,,,,,-37::434-37-3-:2:::gGf,fhvlLEIIJJLLJKLHHBBJLl9.;->73:>3>2>>>>>>222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222>>>,,,,,,,,,4444442222222222<<<<,,,,,,,,,,,,<<<,,<<::,:--333>>>3>-->5>>5->2>>>:,3>-33>>33:->4:43344344444444::::333444444434::::333:322233::44444433:2-:73-7;13,-:4443-44-3:222>>77-1;XXX.66hhhzFERHxxczxBzzYERREKJPIT!RT!RTHJJIETTEYHHKEIHNHlhxHLzlhhhg99996XXXfg611,,:::::44444443:23>>,3>X.XX6+6hYIKHzBKYITRTYIKKIIWWWWWWKKKWWWWIWWWWWYYYYYYERREEHLLWWWKLLLLLFLLKWEREYWWWKLFFFFFLLFFFLLLKWKKLLLKKWKLLWWYEYYWWKKWWWLFFFFLWYYYYERRR}^)[[[)^)__)[_REKJLKKKKKKKKKLLHHHLJJKKKKKIIKLHLKxlxHKJHBc7X-,--,-,>:2>>3-<,,---::--273-::::3:-:3>2322>::<-------<<<-----<<:::>22222222>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::33,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:::::::-::<<<<<<>>>>>>>>>>>>>>>>2222222232222::::::,,33,,,,,,,,,33333333>>>>>>>>;,,,,,,,7:-374::f-:-3:3:,,-X,-,-9hzKIJKIKKKKLHHHJBHLLFxhg>-23>>32>>>>>>222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222>>>,,,,,,,,,2222222222222222,,,,,,,,<>>>>,,,,,,<<<;->33773>->>>22>>>:>>>>>>>>>>,>:>33>>3333373:::--:-4334:43::,232::444444::33::--:2::::::::734:4:::-37,----1.X-,3::47433:733-:73>;-X7hllllxzY}_NFE}RYNxxNLKEYYEYKJJPT!!RTTIJJKIYEEYYJHKYIKKEKLLKKKKKLFzzzzzllxHWF7X.--<,33344:434--3>--->>-1gchxLKYYEEEYIIIKIEYIIIIKKKWWWWWKKKKKWWWWWWWWWIYYERRREWKYWWWWWKKWKKLLKWWYYYWWKLLLLLLLFFFLFFFFFFLLLLHLLLLWKLKWWEEEYWWWWWWWWLWLLWWYYYERRRR^^R^^_)))_^__^}RKKKKKLLHHHLHHHHHLJJJKKKKIIIKKJJJHzxNKT_[Exf7<.-7----,,----.-,,<-33,---32:33::332---52233,,::::::<<<<<<<<<::::>2222222>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3,,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>::::::::::::::::>>>>>>>>>>>>>>>>>>>>>>>>333,>>>>22:,,3333,,,,,,,33333333,,,,,,,,,,,,,,,,>:223333>-37:-,X--f,-;7-XhzKKHHJKKYYKLHHBBHHzHWLSf577>->2>>>>>>22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222>>>>>>,,,,,,,2222222222>>>>>>3333333332223333,,>>>>>>:-:233332:->32>>>>232::2>:2>-:3::::::22:---3773:>3332::>--:,3333-::33333:433322322222444::2333>-3,,-;77-61;1,--:34--2:>-7----,fhlLR(RER(__RRLKR^_TKBHJETJKIYIJKYT^^^RTIKKKIIYEYIYIKKIIYYYERRREEREWLLLKKKYYYWWLcg11;<;--X374--373---77777H(_RR}RTEYIIIIIPIIYIIIIKKKKKKKKKKKKKKKKWIIWWWWIIWYRREYWWEYWWWWWWWWWWWYEEEWWWWWKLLLLKLFFSzSSFFFFLLLHHHLLLKKKWWWEEEEEEYYWWWWWWWWWWEEERRR}^_RRTR^^_!}^^}REYKKKKKKKLHHHHHLLJJJKKKIIIYYYYEYIKIJHKT_]'RLSzxhffcccclh7;7777fffg--,7,37---:-,33-733222>:,::::,,3::::::::::::>2222222>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,:::::::,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,>>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::,,,,,,,322222333333333333333333333333333>>>>,,,,-37:--:-1.;777gl9X;;1..;9xzKKILKKKJJKKLHJBHKFSxcf3:::>3,2>>>>>>22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222>>>>>>>>>>>>>>>>2222,,,,,,,,,,,,3333332222333233::>2233373332>2333233333324332:43233>37:>22>>2327,------>---,3,-;;;;----3,,,>----522322222222222>37,---;X-.X;gSxghlcf7-:-377--,7-7hlDW((WYEEERR}_YJKKYR^RRRKIKIJHJIYIIT^[[[^!TTIIIYTTTTEIIIIIIIKIE^)[[_REYKKKWYWYKKLHFxzcchhgf77--,,,;--71;.X.9hFKYEEIITRTIIIYYYIIIIIIIKPKKKKKKKKKKKKKKKIWWWWIIIYYEEYYEREYWKKWWWWWWWYEEEWWWYEYWKLLLFFFFFxzSFFFFHLLLLLLLLLLWWWWEEREEEEEYWWWYYYYYEERRRRRR}RRETTRTTIER!TEIKLJLHHLLHLLJJJJJJKKKIIYYEEEERR}RREEE^[])^EWWYWLLL'][`](LSlllchczLc7.1XX;-1;;;;--;----::>>:::::422::::::::>>>>>222222>>>>>>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3,,:::::>>>>>>>,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,3>>>>>>>>>>>>>>>>,,,,,,,,::::::::::::::::::::::::<<<<<<<<<<,,,,,,22222333333333333333333333333333222222,,7--,73,7119xWLSES91X7917HKHHLYIEYKHBHLLHLHFlf1-X--2>->7>2>>>>>>22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222>>>>>22222222222,,,,,,,,,,,<<<<<44444422222222>>32222333-5273223::::::::2:-:32::2>>>>32-5>2>5>22-<,,,;;-;---;<,,;;;;;117,;;,;;,7732>233233332233;..-19ghlhghxWEFxFFxcg7.<-;;,1;;,hL((((E(EEER(RREKYR^}TER}^IIKIJIKKITRTT^^^^!!!!TTTT!!RTYEYIIIIJJKKKIEYKEEEEEEYYWHFzzHzxSSzxxlccf1.11XX6.X19gcFYYYEREJKTTTTTTTYYIIIIIIIPPIIPKKKKWKKKKKKKWWWWIIYYEEEYYYYEEEWWWWWWWWWWYYYYKWWYEEYWKLFzzzFFFFFHLLHFLLLLLLLLLLKWWWYEREEEEEEYEEEEEERRTRRRRTRREYYYEEIIKIETEYIKIIKHNBBzLJJJJJJKKIIYETTTERRR}^^_)_)[''[_}RETEYR_]`__))}RWWLzxzLWRSch9799;11XX;11-;,,>::,4444444444444444>>>>>22222>>>><<>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::333,::::>>>>>,,3>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,333>>>>>>>>>>>>>>>>,,,,,333::::::::::::::::::::::::<<<<<<<<,,,<<<--22222333333333333333333333333333444422,,---XX.XX6hhcFHzKWzlX9xlzKYKKKIIYKIIKJJLHJYLvXX1773372>>-2>>>>>>22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222>>>>>22222222222,,,,,,,,,,,,,,,,4444442233333,,,3332>>>>772;-XXX33,::,,:,,,:,333,3>>3,;33>->,,,3-<1;..;<fgg7<..;....XXXX;..;;.;1--5>22>5-555-5>2..1vlHLLSLKzhcFWLzh99h9X7;;;,1..;9lLWWWREEEEEEYY}ER^][TI^^RYYIEIYIKIETTETTT!!TTTTTTTTTTEIIPJJKKJPIIPIIYYIIYEEYIKKHHzxzzzzzxxxllclh6X1ghghcxHKJLLJKIIIPIIIUTTUUIIIYYIIIIIIIIIIPPPIWKKKKKKKKKWIIIYYYYYYYWWEYWWWWWWWWWWWWWWWYEEEEERWWLFSFFFFFFFLLLFFLLLLLLFLLLKWWWYEEEEEEEERRRRRRRRRR}RRRRRTEYYETEYEEEIKJJJTEIJHHHHLJJJJJKKIIYETR!!RR^^^^_)`[[)[)_RYERRRER}__}R___)}RKLHHLLYEREKLLShxxhgg6X;;;;--:,2444444344444444>>>>222222>>><;;>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::333,::::>>>>>,33>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,333>>>>>>>>>>>>>>>>,,,,,333>>>22222::::::::::::::::,,,,,,,,,,,:<---222223322222222333333333,,,,,,,,444442,,flxhfhhfhWYLHKzzKxH99zHEYITTTYEYKYTEYYKHHLc1;73-3--3>>>,2>>>>>>22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222>>>>222222222222,,,,,,,,,,,,,,,,333322>>33311,11>>>-;;,1-;.1vlSSff7111;XX11.XX.;;7;.1XXff1.171;;;.XX1gxFLWWLSxlxxxxlcg99hggf7.XX;;1;;;;1;1111779cclzLKLFxlh9X6lE^YzcxLLzglSl916hlxLWWWWYYYYYYER}TT_R^RT^))^^TTIIIIEEEETTEETTTTTTTTTTTTIIJJHBBBHJJPIIPPPPKKPIIKJBxxHHxxxxzzxxcccllzlvcHFhNHJKKKKKJJIIPPPCUUTUUUT!TTTYIIIIIIIIIPPPIIKKKKKKKKKKKIIIKKKKWYYYWWWWWWWWWYYYWWWWEERRRRRREEWLHHHFzFFFHLLHFFLLLLLLLLLLKKWWYYEEEEETRR}RR^_^^^^^^^^RRRR!!!!RREYKLHHHKKJHBBBHJJJJKKIYYYETTR!!^_____)[)[)_}REYYIIYET!^!^^^_^}^)}YKKLLLFKEER))RxHKWYWFl;.X.-<,,,,>>>>>>>>>>>>>>>>>>22222>>><<<<>>>>>>>>>>>>>>>>",
+">>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3333,::::>>>,333>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,3333>>>>>>>>>>>>>>>>,,,,,,,,>>>22222::::::::::::::::,,,,,,,,33,,,,::>>2223322223333333333333,,,,,,,,444442,,fcxSLWYWYEIYJKJYWhKLHLxSYLIIYITITTYIYEILLLhX;;-33237>>3,2>>>>>>22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222>>>>222222222222222222,,3,,,,,,,332>>>;;;;....XX.....;11hhhlL_`_(YLHLHzlczSchhcczLzxzllWRLzHKLSzSFSzSHLLFFFLWYWWLKWWKLHFLHHHzlcclch911fhhhccllxzHHHHzxxxllccxlzYTRRTERREWWYFlhghYYEWWERYEYYWYYYYTY!Y_^R!^^T^T^T^TTTTTTTIIYETT!!!^^!TTTYIIIIYIPIEIIIIPPJJJHBJJBzkxcxlhcxzxxxlchcxYYYYYYKHBITEKJJIJHJIIIPPUUUUUUUUPIIIIIIIIIIIIIPPIKKKKKKKKKKKKKKKKKKKKKYYYYWWWWWWYEEEYYYYWYERRREEEEWLHLLLFLLHHLLHLLLLLLLLKLLLLKKWIYEEEEETTR^!!^^^^^^^__^^^^_)^^!!YIKKJJKKJJJJJBBJJJJJKKIIYEETTR!!R__)))``)[)^RREEYYYERRRTTRTER^^)_^RYKJKKJKKIR_REIHHYRYKWlhf777;.;;;-----;;>>>>>>>>>>>2222>>::<<<>>>>>>>>>>>>>>>>",
+",,,,,,,,>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,>>>>>>>>>>>>>>::>>>>>>>>>>>>>>>>>>>>>>>>33333333>>>>>>>>33333333,33,>:>333:>335:444444444:3-7:7:3333233333:232::333>:>3322333322,,,,,,,,7>>3::33444:33--XX.7cLEWIIKKYKHLxKxHYHKlKLBBJIIITRYJHKJzHLHS9;3-2222>,,,>>>>>>>>22222333>>>22222333333332222222222222>>>222333333333322222222222>>>222223333333322222222>>>>2222>>>22222>2322>>>2>>>>>>,1;;.X.6fg169yczcclxzxxFKYYYYIYYIYYYYYYYYEEYYYYYYKKKKYEEER}}EKLHxxlcFLFHLFFHLKLFxLHHKKLzxzzlcSWLxzzLKHxxFzzHHxxzxxlxzLKKJKKKKYYYYTIIEYYREEEYKWYYKWEEEYEEEYYYYEEEETTTTRTTTTTRR!RRRRTTTTTTEYTTTTTTT^^^^^^^^^^^^^!!!!TTIPJJJJBnzxchhh99hccxxxxxxhiihYYYIIEYIIIETTPJJJJPUTUPPUUUUUUUTTTTTYYIIIIIIIIIIKKKKKKKKKKKKKKJJKKKKKKWYWWWWWYWWYEEEEEEEEEEEEYWWWKLHHHFFFHLLLLLLLKKKLLLLLLKKKKKWIIIYEETTRR!!^^__^^^^____^^^^!TIIYYYYIKJJJJJJHHJKKKKKIIIYYYEETR!!___)`[_R`[_RTEEEYEEYYYIIIIYEERRRRRTEYYYYIIIIYYEEIKIRRYKKRWzxhlFg6fgg77f167.7..11>-,5>7::>>:::<<<>>>>>,,3>>>>>,,,",
+">>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,>>>>>>>>:>>>>>::>>>>>>>>>>>>>>>>>>>>>>>>33333333,,,,,,,,,,,,,,,,,,33,333->22>->f23333222223:34254443333344443333-->,,3>>:::>2222,,,,,,,,>--333>-444773fcxlSLFxlHJIJBJIJBHzlBJzBHHJKKKPIIIEIKKIIJHLHWg7>>2222>,,,>>>>>>>>22222333>>222233333333332222222222222>>>222333333333322222222222>>>22222333333332222222222222222>>>>23773332>233232>;>,>6169hxLEKHLEYYYJLKYEEEEEYIIIIJKIYIKJJKIIKKKKPIIKKKKKIIIIIEEYIIKHxccxFFFLLLLHFFNxHJKJBzxxhhhczHxxhxHKBzzNzxxxxzHHBzzHKKKJKKKKIIIIIIKIKHKKEEEEEEEEERRREEEEEEEEEEEEETTTTRTTTTTTTTTTRTTTR!TT^^^^!TTT^^^^^^^!^^^!TTEYIIIIIPJJJJBBzkchh98hccllcxxchhlzIIIIIIIIIIITTIKPIIIUTUUUUUUUUTTTTTTTTYYYIIIIIIIIKKKKKKKKKKKKKJJJJJKKKKWWWWWWYYYYYEEEEEEEYEEEEEYWKKLLLLLLLLLKKKKKLKKKKKKKKKKWWWYYYYEETTTT!!!^^^^^^^^^^^^^^^^^!TYIIIIIIIKJJJJJJJJJKKKKPIIIYEETTRR!^RRR^RRR_^REYYYYYYYYYYYKKYYYYEETTTTEEYEEIIIIIYYYIIER^TYWRYzlchFWxzlcczHcxxcch9.X1;3>->-2>:::<<<<>>>>>>,,>>>>>>>,",
+">>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,,>>>>>>>>:::>>>::>>>>>>>>>>>>>>>>>>>>>>>>3333333333333333>>>>>>>>>>>>,,>>-77--3>X5>222>>2-33>-537::>22222333322>>73,,,>>:73322222,,,,,,,,,333>,337>:>--flh77.69.gJIIKYEKBEBBHKKBIxHKIKKKKKPPPIIIKKYHF.XX32222>,,,>>>>>>>>22222233222233333333333322222222222222>>222333333333222222222222>>222222333333332222222222222>>>>>,>---->>333>>>;33;37fflzKEEYKLHBJTRIJJIEEEIIKJIJJIIBBPBBBHJPIITEYETTYIIIIIIIIKKKKIIYIIWKWHxlhxLLLFNHLLJIIJzzzxcclzHzxxxxBBHHBxBxcxHKKKKJJKIIIKJJJJJKKKJJHLxcxzKKWEEYERERREEEEYEEEEEEEEEEETTTTTTTTTEEETTTTR!^^!^^^^!!!!!^^^^TTTTTTTEYYIIIIIPPJJHBBnzzxchyyhhclczzliilLIKKKIIIIEIIIIYIITEIIIIUUTTTTTTTTTTTTTTTEYIIIIIIIIIKKKKKKKJJJKJJJJJJJJKKKKKWWWWWYYYYEEEEEREERRREYWKKKKKKKLLLKKKWKKKKKKKKKKWYYYYEETTTTTRR!!!!^^^^^^^^^^^^^^^^^!!TEYPPPPIIIPKKKJJJJKKKJKKIIIIYYETRR}RREEEEEERREYYYYYYYYYYYYWKKWWYYYYIIYYYYYEYYIIIIIIIIERREKKERFxl9gxHBxlxxNLLLWKLxh97-;;,3->>:::::<<>>>>>>>>:>>>>>>>",
+">>>>>>>>>>>>>>>>:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,33>>>>>>>>>>>>>>::>>>>>>>,>>>>>>>>>>>>>>>>,,,,,,,,33333333>>>>>>>>>>>>>>>>7--,,;;<-----;17;-;-;;;X>>>23333>332>>::---;,,37--:>>233,,,,,,,,:3>--::,;;371,-XX6lcxLS(HHJYTYKIIKYJJIBKzBJKIIKJJJPIIJJJBJLLg1-3>222>>,,22222222222222223333333322222222222222222222222222233333333222223322222222222222222222222222222222222>>,-->,131,1;111117-;;X7lLWKE_`^IHBJKIT^RER^^^YIIETTIIIJxxBkxBPT!!TTTTTYIIIIIIIIIIIHBBJKKJJNlzxFWHLLHHHLLWYIIIJJJJBHKKJJLHHzxxzBJJNxBBzBBHKJJJKJJJKKJJJJJKKKKJLc8czzHWYYWYYYYYYYYYYYYYYYEEEEEEEEEEEEEEEYYEETTTT!^!!TTTTTTTTTTTEEIIIPPIIIIIIIIPJJJJJBBBzxxch0099hcxllh89yxHKKKKKKIYEIJJKIIETIPPIITTTTTT!!!!!TTTTTEEEYYYIIIIIIKKKKKJJJJJJJJJJJJJJJKKKKKKKKWWWYYYEEERRRRREEYYWWKKKKKKLKKKKKKKKKWWKKKWIYEETTTT!TR!!!^^^^^^^^^^^^^^^^!!!!!!!!TTEIIIIIIIPKKJJJKKJKKJJJKIIIIYYYEEEYYYYYYEEYYYYYYYYYYWWYYWKKKKKKKKKKKKIIIIYYYIIIIIIIIERREIKLRKxh9hlxBJKJxxHHzKHKLzlFh9117>3>:::::::>>>>>>>>:::>>>>>",
+",,,,,,,,>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,333>>>>>>>>333,>>::>>>>>,,3,,,,,,,,,,,,,,,,,,,,,,,,>>>>>>>>333333333332>>>,.17.XgllFFSSSFLWFxxxKSl9,>;;;>>>;,3,,773;;,71;-;,,3322>>,,,,,,,,>3-:77:>;X.;;11X;fLWYWS(JLKIKLKYLYRKHJHJBBBJKIPJJKIIPBBHBzHKSh1;>222>>,,22222222222222223333333322222222222222222222222222233333332222223332222222222222222222222222222222222>,,3,,<11;;61XXXXX.69vghxFFlBERTIYTT^TE!RT!^!TIITTTTIIJHBJITTTTTIJBKIIIIIIYIIIIIIIIKJJJKJJJHHYLHKHWWHHKWLLKKIKJJIKBHKJJKKJKzzBNciiihchicxchHJIIKJKIKKKJLLLJHHHzv1glzLYYYYYYYWWWWWWYWWWYYYYYYYYYYYYYYYYYYYEETTTTTTTTTTTIIIIIIIKKJJJJJJJJJHHHJJJHBBBBHHzxchi9998hhhch998hxHLLKYIKKYIKJHHJPIIIPPIYTTTTTTTT!!RRTTTTTEEYYYYYIIIIIKKKKJJJJJJJJJJJJJJLLJLLKKKKKKWWYYYEEEEREEYYWWWWWKKLKKKKWWKKWWWKWYYYYYYEETTTT!!!!!!^^^^^^^^^^^^^!!!T!TTT!TTTTTTEYIIIIIPPJJJJJKKJKKJHJKIIYYYIKJJJKKYYYYYYKKKKKKKKWKKKWKKLKKKKKKJJKKKKKIIIIIIIIIIIIYT^^^RTRYHzLWHhkJKBJKHzKBLzLHxcLzxllg3->:::::::>>>>>>>>:::>>>>>",
+",,,,,,,,>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,,3333>>>>>>>>3333,>>>>>>>,3333333333333333333>>>>>>>>>>>>>>>>33333333322>>>;;1gcccW}EEEEYYER_RYRW_YWF1;.....XX.XXXXXX1.X..;;7;;>>>>>>,,,,,,,,>73>,-3gg111XX;11;71fg17nJEYJJKJKIJJKJJJBHJJJPIIIIIIPBBHHNzcSFc-,>222>>,2222222233222222333322222222222222222222>>222222222333332222222>333222>>222222>>2222222222222222222332,,;;;.XX..X.6vclxzLYEYWLxhhzYRTEETT^!ET!!!!TIIT!EPKIIIITTREEYYEEEEIETTEYERYYIIIIYYTEYIIIKKEKWKYRKLYLHWYLHLHJKJJJHBBzzHHzxzhhxHzccllch8lBx8zBJKJBBHHHHHHLLLKKKHh9czFKYWWYYWYWWWWWWWWWWWWWWYYYYYYYYYYIIYYYYYIIIIIIIIYIIIIIPPKKJJJJHBBBBBBHHHBHHHHHBzzzxch89+h8996999vhxHKWWYKYYIIIJBKJKKIIIIIIYTTTTTTTTTRRRRTTTTEEYYYYYYIIIIIIKKKKKKJJJJJJJJJJJLLLLLLLLLKKKWWYYEEEEEYYYWWWYYKKKLKKKWWWWWWWYYWIYYYEETTT!!!!!!!!^^^^^^^^^^^^!!!!!!TTTTTTTTTTTYIPPPPPPJJJJJJJJJJJJHJKIKIIKKLHHHKKYYYYKKKLLLJKKKKKKKKKKLJJJLJLLLJKKKKKKKKIIIIIIIYETR^^RREER}YIKHzBBxBEIJKLKLHzxxlcc91;-3>:::::::>>>>>>>>:>>>>>>>",
+">>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::,,,33333>>>>>>>>>>>,,,,,>>>>,3333333333333333333>>>>>>>>,,,,,,,,,,,,,,,,2>5>37,-1XfLWLLWKKIKKJKKEERYTYRRFSSSSSxxllchhcchFlgf97;X----->37,,,,,,,,-3>>>X>cWFKYFlhgX.1XX,--9hLEYYYKIHzBKKHHIEEIIT^^TIPJJHBBxzzcLRx1,>222>>>2222222233322222332222>>2222222222222222>>>2222222233333222222>>333222>>22222>>>222222222222222222223,,,-7ghhhlxLLKEREYYEEIKJHHBJPEEETTRYTEET!!!TUUYTIJBIETRRRYIYYYYYERREEEEYYYYYYIKKKIIKIKKJKKLHJWWKKWWYWKWYWKKJKIKJHHHHBBBBxcxxxHKJHHzHLKHNHKKKKIYIKKKzzHLJJKKKKLHlhxFLWWWWWWWYWKWWWKWWWWKKWWWWWWWWWWWIWWIYYYIIIIIIPPPPPPPIIPPJJJJJJHBBBnnBBBHHBBnzxxxchhh89++h8hhhcxzlxFLLKWWKKKWKHHHYYYYEEEYYETTTEETTTTRRRRREEEEYYYYYYYYYYIIIIPKKKKKJJJJJJJJJJJJLLLLLLLLLKKKKWWYYYWWWWWWWWWYKKLLKKKKKKKKKWYYYYEEETTTR!!!!!!^!!!^^^^^^^^^!RRR!!TTTTTTTTETTTIPJJJJJJJJJJJJJJJJJJJHLJKJJJLLLLKKYYKKKKKKKKKKKKKKKKKKKKKKKJJJLLHHLJJJJJKKKIIIIIIYEEEETTEYRIIIJKIYBBIIYRYKxzzHzlx|xxlg11-3>::44444,,>>>>>>>>>>>>>,",
+">>>>>>>>>>>>>>>>::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::33333333,,,,,,,,::::::::,,,33333>>>>>>>>--:>,333>>>,3333,,,,,,,,,,,,,,,,>>>>>>>>33333333>>>>>>>>72>3ff7;;7SRREEWET!!TIIIIIIYT!TY(((((REWWWWKWEEWRWLWRWFllcgf7>>5,,,,,,,,>>:fcf7gLHWRE((WSxSSc7,799zRRYYYKKYJKIJYTTEIETTT^IJBBBBnJzxzFS9-,>222>>>222222223332222222222>>>2222222222222222>>>222222223333322222>>>333222>>22222>>>222222222222222222223,,,cSY(EYE(TYIIIKKKJKKIIYTTTTEYTRTE!TT!!TT!UTTTIJPYTEYETTEEYEEREEYYYYWWWWWKKWKKJJJLLKKLLKKKLKKWWKWKEEEIWYEYTYIIIKKJJIKHHHHBzzSzlxzzKLLKLLKLIKHHHHHHHHKKKKKKWWLLzxHLWWWYYWYYWWKWWWWYWWWWWWWWWWWWWWKKYWKWYYIKIIIIIIPPPPPPPPJCBBHHJJHBBBzzzzxxBzxchhhhh8899XXX06hzzzxxzHLLLWWKKLLKHxzKYEEEEEEETTTTTET^RTRTTTEEEEYYYYYYYYYYYYYYIIPPKKKKJKKKKJJJJJJJLLLHHHHHLLLKKKKWWKKKKKKKKKKKKKKKKKLLLKKKKWYEETRRRRR!!^^^!!^^^^^!!!!^^^^RRRRRTTTTTTTTYIYYTYIPJJVVJJBBJJKJJHHJHJJLLJJBLLLLLKKIYYKKKKKKKKKKKKKKKKKKKKKKKKJJLHHHKKKKKKKKIIIIIYEEEEEETRTEYIIJJJBBIJPBBTYHHnc||zxlchh6.1-->:4444443,,>>>>>>>>>>,,,",
+">>>>>>>>>>>>>>>>::::::::::::::::;;;;;;;;>>>>>>>>444444::::::::::;;;;;;;;<<<<<<<<<<<<<<<<.--;--;;444444444434434:444344444434:444,33-3:3,3-37--3:1;;1119glc9XXXXX.1.;;X;X;51>-->3111;;,>>-7->3-7:3:::333:233::33:1;-27f7257gclSWEEEERRTR^^!TTTIPJKIIHzzJYEYYIIKHzBJKIIITTTKLKHh6X;;11XXXX+hhcHEJcqhLnHYTHJKYEIJJKIIIKJJJKKJJJKPITTIIIT^!TEIJHHHzxxLKxWx;->>:,,,,,2222222222222222<<,,,,,,,,,,,,,22222222222222222,,,,,,,,>>>,,,,,,,,,,,,223322222<<.-<7,;;,,2373-1;11XXhHEEIPPPIPIJPR^TIIKIIETEETIIYYEEEETTEEEEEEIIIIIYTTITTIKIYIYYIIIIIIIIIKKKKKJJKKKJJJJJJJKKIIIIPIYYIJIIYTTTTTYYYIIIIPPPKJJJJJJJHBBBBBJPPPCPPPPPPPPJJJJJPIKKKKKKKKLLLLKWWWYYYWYYYYYYYYWYYYWWWWKKWWIIIIYIKIIYIIIIYYIIIYIIIIIKKJHHHHHHBnBBnzxxcchh999vhhh9v9XX1XXX9xzxzLLHHLLHHLNLJJKYKLLKYYIYERYTTTRTEETEETRREEEEYYYIIIIIIIIIKKIIKKKKKKKKJJJLHHLLLLHHHHHHHHHHHHLLJKKKJLLLLLLLLHLLLLHHLJKKIYYEETT!^^^^^^^^^^^^^^!^^^^!!!^^!!!!TT!!TTTYIIIYEEYIPJJJJJJHBBnBHHHHHHHLJJKIKJJLHJKIYYYYIKKIKKKKKKKKKIKKKKKKKKJJKKKKKKKKIIIIIIYYYIIYEEYYEEEYEETJBKJJzzIYzxzxHLxxSFSWYHgf7,<-<<<<<<<<<<222222222222>>>>",
+">>>>>>>>>>>>>>>>::::::::::::::::;;;;;;;;<<<<<<<<4:::::::::::::::;;;;;;;;,,,,,,,,<<----<<7,,,,,;;444444444444:-4733::::433:433333-::3,3:-:--:-:3:X11XX9xWLWWShg9969ghchg9f717771-XXXXX;;;1-;>::--3::3,-:7,--77:-3X;;-->552->gSLLLLzlxFLJKJKITTTIPKKJJKT^)`_TIIIIY^^^TTIIIKLJIEIJLxSLSv1169lHKIETTnxITTIKKBHJKJHHJHHJJJJPIJKIIPPIITTIPIET^IJBnBHnzzLzLlXX7;>333,:-2222222222222222,,,,,,,,,,,,22222222222222222222,,,,,,,,>>>,,,,,,,,,,,,223322222-<,<<<,,<,;-X-;1.;XX6hBKIIIIIIPPIIIEIJBHKIIIIIEEIIIYYYYYYYIIIIIIIIIETEIIIYEIKPIIIIIIIIIIKKKKKKKKKKKKIIKKKKKKKKIIIITTTEYIIIIETTTTTTTTEYYIEEYYYYIIPPPJJJJJPIUPPPUPPPPIPPPPJKKKKKKKKKKKKKKKKKWWYYWWYYYYYYYYYYYYYWWYKWWWIIIIIIIIIYIIIIIIKKIIIIKKKJJJJJJJJJHHBBnzzzzzllccchhv99v969v919hzFHHLLLLJLLLLHJJLLKLHHLKKKIYEETTEREYEYYETRTTEYYYYYIIIIIIIIIKKKKKKKKKKJJJJLLHHLHHHHHHHHHHHHHHHLLLHHHHHHHHLLLLLJJJJJKKIIIYETTRRT!^^^^^^^^^^^^^!^^^^^^^^^^!!!!TTTTTTEYYYYYYYIPJJJJJJJBBnnBHHBBHHLJJKKKKJLLJJKKIIYYIKIIKKIKKKKKKKIIIIIKKKKKKKKKKIIIIYYYYYYYYYYYEEEEYYIIYERIHBxHHJzJBzHxllxlxlhch7773,--:,<<<<<<<<2222222>>>>>>>>>",
+">>>>>>>>>>>;;;;;::::::::::::::::::::::::>>>>>>>>::::::::::::::::--------::::::::------------;,>;3334::--3::333::3,3333::,--,3::,1,-7X;-;;-X-,1;-1.XXhLREWWWYR}(EKKHLKW((_EWWWWSlchhxFScggfFFcf.7---------37;----.11,>2327--fhcclFHKEEYIIYYT!^^^^)__)[[_RHLKYTR^^!!TTTTYYRTTTRRYIRYWYWKHxzzxzLJHBBBIKJJHxznHKIKJJJJJJJJJJJKKHBJKKIIIIKKKIYKLHHHzzLzzz97-;332::3372222222222222222,,,,,,,,,22222222222222222222222>>>>>>>>>>>>>222,,,,222333222222:333>-;,.;179f99.9ghzWIHKIIIIPPPJJHBxxzHIIIIIIIIIIIIIIIYYYYYYYIIIIIIEYIKKKKKJJJJKKKIIIKKKKKKKKKKKKIIIIIIIIIIIIIYIETTTTTTIIIYTTTT!!TTTTTTYEETEEYYYYIIIIIIIUUUPUUPIIPPPPIIPPKJJJKKKKKKKKKWKKWWWWWWYYYYYYYYYYYYYYYYWWIIIIIIIIIIIIIIIIIKKKKKKKKJJJJJJJJJJJLHHBBzzzzzzxxxxlcchhcchhclhczSHHHHLLLLLHLJJJLHHHHHHLKKKWYEYEEYEEYEIYETTEEEYYYIIIIIIIIIIKKKKKKKKKJJJJJLHHHHHHHHHHHHHHHHHHHHHHBzzzzzBHHHHLLLKKKKKKIYYYETRR!!^^^^^^^^^^^^^^^^^^^^^^^^^^!!TTTTTTEYYIYIYIIIIPJJJJJJHBBBHHJJHHJJHJKKKKKKKKIIIIIIYYIIIIIIIIIIKKKKIIIIIIIIIIIIIYYYYYYYYYYYYYYYYEEEEEYYIYYEIIKBhchczHzzzchc91;.XX;X----<<::<<<<<<<<>>>>>>>>>>>>>>>>",
+";;;;;;;;<;;;;;;;:::::::::::::::::::::::::::::::::::::::<<<<<<<<<:::::::::::::::::::::::>33333333>>233333>33>>33----;,,,,7,-,,-X;;.;769fghhhlLWWWlxlxLRRWYYWKLKWWKKHLKKRRWKKWYYWKRWLKWWWWFcY}EWlllxlcllg1..;17gf991.-;>;>>;1166gczLYYLBJETTT!!^!!EYIJLJKKBBzzNHKIIIIETTTTRRTEEIJHSxzzSHHzHBzzzzNHKzBHHznHHBzHJJJKJJJKIIKJJKJBBJKIJPIIIJJHJLHHHHHHKSHhX11322>>:>23>>>>222222222222,,,,,22222222222,,,,,,,,,,,,,,,,22222222222223332222222222222222344373,,flHWYEWLLLWEEEIIKIIKKKIYKHzxzHJKIIIIIIIIIIYYIIIYEETTEEYYIIPPPIPKKJJJJJJKKIIIIIIIIIIIIIIIIIIIIYIIIIYYYYYEIKJJKIIIYYIYETTTTTTTEEETETTTEEETTTTTTETTIIIIIIIPIIIPPPPPPPKKJJKKIWWKKKKKKKWWWWWWYYYYYYYYYYYYYYYYYYIWKKKKKKWIKKKKKKKKJJJJJJJJJJLLHHHHHHHHHHBzzxxxzxxxxxxxxlxzllxzxHHHLHzzHLHHHHHLLHHHHHHLFHLKKWIYIYYIEEYEYETTEYYYIIIIIIIIIIIIKKKKKKKKKJJJJLLLHHHHHHHHHHHHHHHHHHHHBNzzzzBBBBHHLJJKJKKKIIIIIIETTTTR^!^^^^^^^^^^^^^^^^^^^^^^^!TTTTEIIIIIIPKKPPKJJJJJBHHHBBBBJJJJJHHJHJKKKIIIIYYYYYYYYYYIIIIIYIIIIIIIIYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYIIIYYYTEYLhhhlhxFLFh1X1-;1;<1;--::::::::::::::::::::::::::::::",
+";;;;;;;;<<<;;;;;22222222::::::::::::::::::::::::::::<<<<<<<<<<<<::::::::::::::::444442225>>>>>>3,111;;;;;;,;--;71;.XXXXX...7gcxLKLWWEYEEEEWWEEKLWYYWKWWYKKWYYEEYJKJKKJJHJKKJHHHHKKWWLHLKENKYWWWWWWLKWWFlfX1x((((Rzf71XX1XXXX1gcllxlcccxzHJITTTIPJJHBzBJIHBzxlxzHYETTRTTTEIIYYKKKLLKKHHLLzJKKKJJKKHBBzBJKIHxxzBJIKKIIKKKKKKKIYYYYIIPKIIKJKJHHnzHKKl.X;X7-5>3773>:;>,,,,>>>22222222222222222222444,,,,,,,,,,,,,,,,2222222222222222222222222222222244423>;1XcWYKKIIEWKKJHHKKKKKKIYTYYKKYEYKJKKIYYYYIIYYIIIYIIIYIIIIPPKJJJJKKJHJKJKIIIIYYYIIIIIIIIYYYYYYYYYYIIYYYYYYIKJJIYYYEYYYETTTEEYIIIIIEEYIIIIYTEYYYTTTIIIIIIIIIIIIIIIPIPPKKKKKKKKKKKKKKKWWYYYYYYYYYYYYYYYYYYYWYYWKKKKJJJJJJKKKJJJJLHBBzzzzzzzzzzzzzzBBBBBnzzzzzzzFNzxxxlxzFzHHzHHHLHzHHHHHHBHHHBBBHHHLzHLJKKKIIYIIEEETETTEYIIYIIIIIIIKKKKKKKKKKKKKKJJJLLLHHHHHHHHHHHHHBBBBBBBBNNBBBHHHHHLJKKIIKIIYYIIIIIETTTTTTTTT!^^^^^^^^^^^^^^^^^^T!TTTEIIIIIPKJJHBHHHBBBBBBBBBBBHHHJJJHHBBBJKIIYYYIYYYIIIYYYYYIIYYIIIIIIYYIYYYYYYYYYYYYYIIIIIIYIIIYYYYYYIKKKKKWWIYWWEYxh9vhgf99717>--,;---3,::::::::::::::<<<<<<<<<<<<<<<<",
+"<<<<<<<<<<<<<<--2222222222222222:::::::::::::::::::::<<<<<<<<<<<::::::::::::::::444432223332>;>>X...XXX.;X.fh7XXX6vhlxxzSzxxFLW(EEELYKWKEEYWYYKHYLHLKKKKIKLKEEKBHJBHHBJHBBBBBHHLKKKKKKKWWKWWFxHKHzzLKHHKKxlLYWKWEKWYLcf9ghhvhxzxxxxxxxxxzBJPIPPJJJJKKJHHIYIKHzlcYETTTTTEREIIIKKIYKKYETYKJKLLIYLzBIBxxHKBKHzzzBBLKIYKBzHKIJJIYYIYIIJJKIKJKJHzzzJEYKSlc1;.;;--->>2;;;;,;;;,>>222222222222222222224,,,,,,,,,,,,,,,,222222222222222244442222222222>>4422>--1XlYEIIIPYYYIIKKJHHLKKIYYYYYYYYWKKKWYYYWKKIIIIIIIKKKKKKKKJKPKJHJJJJBJJJJIKIIIIIIIKKIIIIYYYYYYYIIIIIIIIIIIIIIYYYYEIIIYETTTTTTTTEEEIIIIIIIIIIIIIIYYEYIIIIIIPIIIIIIIPPPPIPKJKKKKKKKKKKKKWWYYYYYYYYYYYYYYYYWKWKKKKKJJLLLLJKKWLLLLHHBzxxxxxxxlxxxxxxzzzzzzzzzzzzBHHzxxxxxzHHHHHHHHLHHLHHHHHHHHHHHBHHHHHHLJKKKKIYYYEEYEEEYYIKIIKIIIIKKKKKKKKKKKKKKKJJJJLLLHHHHHHHHHBBBBBBBBBBBBBBBHHHHHJJKIIIYYIETTTTTTTT!!!!!^RRR!^^^!^^^^^^^^^^^^^^RTTTTEIIIIIIPPKJJJHHHHHHJJJJJJJJJJHJJJJHBBHJIIIYYYIIIIIIIYYYYIIIIYIIIIIIYYIIIIIIIIIIIIIKKKKKKKKKKKKKKKKKKJKKKKKKKWEKLLlchcf6;.-;->3>---:37::::::::::::::::<<<<<<<<<<<<<:::",
+"::::::::,,,:::--2222222222222222:::::::::::::::::::::::::<<<<<<<::::::::,,,,,,,,222222222;--;;;;79fghclxSxzKEKxhHKERRYWKRRYKEYLKJYKBKILJKIIKLJKJKKYYKJJIYEYIJHHLBHHJJBJHJHBzzzxxBJIETEJzLLLJKKLzKLHLLHLKKKKHFHKKLHLWWLKYWWWLHHLLzzzzzzBHBBBBBBBHIJJKKIIIKKIIIKKKKIIYYEEEETEIIIIIIIYYKKKJLJJHJKKKKKzJHBBHNzzBBzxxzBHHHHKIKJLJKKIIKKIIKKJHzzzzBHKRYKREERSxgf71;;;1;;;;;;;,,,,>22222222222222224444>>>>>>>>>>>>>>>>222222222222222244444222222>>>>>322ffghhzKTR^^TIEYKHHLHBLHHKWKKKKKKKLLKWYYYYYWJLKKKKKKKJJJJJJKKKJKPPKJJJJJJJJJJJKKKKKKKKKKKKKIIIIIIIIIKKIIIIKKKKJJJJJJJJIIIYEEYYTTTTTTTEIETTTEETIIIIIIIIEYIIYYIIIIPPPPIIPPKPPPKJKKJJJJJJLLHHLJKWIYYEEYYIYIIIIKKKKKKKKKKKJJLJKKKKJLHHHHBzxxxxxxllllxllxxxnzzzzxxxzzzzzzzzzzzzHHBBLHHHHHHHHHHHHLHHLLHHHLHSHLLJKKKKIYYIYYIYYYIKKKKJJJKKKKKKKKKJJJJJJJJJJJLLLLHHHHHHBBBBBnnzBBBBBBBBNBBBHHHHJKKIIIIYETTTTTTT!!!^!!!!^^^^^^^^^^^^^^^^^^^!!RTTTTEYYIIIIIIIIPKJJJJJJKKKKKKKKKKKJJKKKKKJKKIIKIIIYIIIIIIIKIIKKKIIKKKKKKIIKKIKKKKKKKKKKKKKKKKKKLLLLLLLLKLLKJLHFFHHlcxFzShglgcggf33-2333:--::::::::::::::::<<::::::::::::::",
+"::::::::33222:::2222222222222222::::::::::::::::::::::::::::::::>>>>>>>>333333332222>>>;-.1fcSHLKKYYE()]R_EHzLWKTR^RYKKKTRYIEJchHRIIEYxxTETIBHJHKIEEYYERRYIKJJJJKIJJHBHHBBBzzzzBzJKHxxzBHLJNHKLJLJLBJEYJKJLKKKJLKJKKKKKWWWLLHLLLHBNBHHHBHHHHHBBBzBHJJHHJIIIKKKKKKIYYYIIYITRIIYIKIIIIJJJJKKKKIKJKJEHJHJJHHBBHBzzBzzzBKIKHHKKKKIIKETRTIKJKIKKYYKKIYIHIHKEWYWLSlg9111.X..11;,,,,>>2222222222222224422222222222222222222222222222222444422222>>>>,,,3--gSWWWEYKLHBBNnBHHLJJKIKLKWWKKKKKWYWWWYWWYWWKLJJJJJJLHJJJJJKKKKKKKIIIIJKKKJJKKKKKKKKKKKKKKKKKKIIIIIIKKIIIIIKKIIJHHJKJJIIIIYYIIIIIIIIIIPIETEIIIIIIIIIIIYIIIYYIIYIIIPPIIPKKKPPKJJJJHHHBBHBzzNHLJKIYYYYIKIKKKKKJLKKKKKKKKKKKKKKJHLHHBBBzzzxxxxxxxlxxlllxxzzzxxxxzzzBBBBBNzHHzBHHHHSHHzHLHHHBHHJLBHLLHHKLzHHHLLJJKKIIKIIKIIIKKKJLHHJJJKKKKJJJJJJJJJJJJJLHHLHHHHHBBBnnzzzzzzzzzzzzzNNNBBHHJJJKPIIIIIIIIIITTTTTTTTTTT!^^^^^^^^^^!TTTTTTEETTTEEYEEEEEIIIIIPKJKKKKKKKKJKKKKJJJKKKKIIIIYYYKKKKKIIKKIIIKKKKKKKKIKKKKKKKKKKKKKKKKKKKKKJJJLLLLLHHHHHHHLLLLHHzxllxxFzHWKKc9-X7777-::3:--:,3:::,,:::::::::::::::::::::::::::",
+":::42244::4444::>>>>>>>:,,,>>>>>:::::::::,3,::::4444444:4::23:::,33>-->3-7>>>-7-,;;;;;;19lSLEYYERREYKWR_R}YYHzKLTRRRREIKYYKLzzzzJJIIIKIITTEYIIIIKIYETEIJJLHHHHHHJLHHHHHLLJJLJKHzHKKzxNHHLLLHJIYIcnITEIYERTYIKKKKIIWKKKKKKKLHHHNzzBLJLBBHJJHzxxzxBBHBBzBBKKJJJJKIKKKKKKIIIIIIKKIEIIIPKJJJIKKJJJJJLHBBBHHBBHHHHHJKIKKKKKKKEYKJJJHHHHHHBBHLLHHHHHHJBHHHHKKLKLKKWWWKWFlhf91.;;;1112>>23333222222332272>3722222222222233322233>>22->722>2333233>---;,.19vhhcllllxxzzzLHHHLLHHHHHHHLLKKKKKKWYYKKKKKKLLHLLHHHLHHHHJIYYIPIYYIIIKIIIKJJJJKKJJKKJJKKKKKKKIIIIIKKKKIIIIIIKKIIKKKKKKIIKIIYIIIIIIIIIIKIETTEEEIIIIYIIIYYEEYIIYEYIIIIIIIIIIIIIIPKJHBBBNzzzBHHHHJJLLLLLLLLLLJJKIKKYYYKKKKKKJJJJJHLJLHzHHzzzxxxzzxzzzxxzzzzzxzzBHLLLLHHHHHHHBBBHHzzzzNBNzHHHHHHBzNHHHHHHHLLLLLLLHIKKKKKKKKKYLHzHJJHzBJKKJHHJJJJJLHHHHJJHBHHHHHBzzzzzzzzzBzzzzBBBBBBBBBBBBHHJJJJKPJJPPPPIIEETTTT!!TTTTTTEEEETTTTTTTTTTTEIIIIIPPPKJKKKKPPKKKPPKKJJKKKKKKJKKKKKKIIIIIKKKKKKKKKKKKKJJKKKKKKKKKKKKJKKKKKKKKKKKKJJJKKJLLLLLLLHHHHHzxzzFHHHHHHLKHFLFlFx17,--3:-7:42:-,,,>-->33>->>:::>,,:::::::3:::::444",
+"22224::5::::::::->>>,,33>>>>>>>>:::::::::::::,33444433333:22:372---;11;--;;11,1-;..6glFWERWKKNLEIKYYYYRR_)RRYJYKRTTEYYYYYYIKJJJKJPITEIETTTEIIIIIKIIYEYKJBHHLHHBzLHHHHHHLHHHHLJLHzKYKLLHzLKKKKKKHnJIEEETRTEIIIIIIJJJLHHHHHHBBBHBBHHHHHHKYIIKJHHBBHHHHBBHJJJJJJJJJKKPIKKKIIKKJJJJJJJHHHJJJBnzznHHHLJHBBHJJBBHHHLJKLLHHLJKKKHzxxxzzxxzzNNHHHBHHHHHLBHBBBJKJKJJKKWWWKKKKKLSxgf1;-;;;73>;>237>>>>22222255222222223733:>>>>>2333237735>23>--;>X-;17fggccllxxzzFFFSSSSSHHHHHHHHHHHHLLLLWWWWWKWWLLLLLLLLHHHHHHHHHHHJKIIKPKIYYEYIYYYIIIIKKKJJKKKKJKKKKKKKIIIIIIIIIIIIIIIIKKKKKKIIIIYYYYYYIIIIPPIIKIIYYYEEIIYYIIIIIIIIIIIIYYYIIIIIIIIIIIIIIIPJJJJJHHLJJJLHHHHHHHHHHHHLLJKKKIYYYYIIIKKKKKKKKKJJLLLJBHHnzznzzBHBzBHHHHHBBHHJJJLLLHHHHHHHBBBzzzzzzzzzzzNBBNzxNHHHHHHHLLLLJJJJJLHHLJLHKJJBHBJKKJJJJJJHHHHHHHHHHJJHzxzBzzzzzzzzzzznnnnnnnBBBHHHHHHHHJJJJJJJJJJJJJJJJJJKJJJJJJPPKKPPIIIIIIYYYYIIIIIPPPKJJJJJJKKJKKJJJJJJJKKKJJJKKJKKKJJKJKKKKKKKKKKKKKKKKKKJJJJJKKJJJJJKJJJJJJJJKKKKKKKKKKKKKJLLLLLHHHHHLLHFzHLLJLLLLHHLzxzFFHl.X-7::3----:33;-<-;,,;;;,,,,,;;;-,,,>::::3225::42",
+"5:>>222222222222>;;-----;>>>>,,,---:>>>>:::::>>,24::42>:3:33-,7-1;.....X7;;.;;X;169lLEYKKYY_)IKTYYERETRER_ER_EEIIKKJJKKIIIIIIYYYIIETEYYEYYYYYYIIYYYIWKHBxzHLHHzzHHHHHHHLLLHHHzxlczLLLKWKKKIIIKHnznBBHJJJJJJJJJJJHHHHHHHHHLJJHHHHJLJJKKIYYYYIKKJLJJJHHHJKHJJKKKKKPIIIIIIIJJJJJJJHBBBHLJJLBzzBLKKKEEEWLHBzHHHHBNNNzzzzzNBBBzzxxzxxzzzBBNBHNBHHHLLHHHBNNBBBBzzzzzNzzzzzxxlclcggggf9,;----;>33,>>>>>2772522537325523,,,,37733>---,;--;;;117779ghclxxzxxxxzzzzzzzzzxxzzBBHHHHHLLLLLLLLLLLHHHHLLLLLLLLLJKJJKKKKKKIYEEEIJJKIPJJIIIIIIIIIIKKKKKKJJKKJJJJKKKIKKIIIIIIIIIIKIIKKKIIIYEYYYYEYYYIIIIYIIIIIYYEEEEEYIIIPIIPPPIIIIIIIIIIIIIIIPPPIPPPPKKKKKKKKKJLHHHHHHLLJJKKKKKKWIIIIKIIKKKKIIIKYIKKKIKKLJJJLLLHHLLHHLJKKKKJJKKKKKJJJJJJHLJLHHBBNzzzzzzxzzBBBzzxBHHHHHHHHHHHHLLLHBBBBHHBLHHnHHJJLJJJJHHHHHHHHHHBHHHzlcxzzzzzzzzzzznnBBnnBBBHHHHHHHHJJJJJJJJJJJJJJJJJJJJJKKKKJJJJJJJJPIIIIIIIIPPKPKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJKJJJKJLLJJJJJKKKKKJJJJJJJJJJJJLLLJJJJJJJJJJJJJJJJJJJJKKKKKKKKJJLHHHHHHHHHHHHNNHLJJJKKKHHFLxllllllf-,3,:-7377;....;;;..XX.....;;11-;;;,33355>>2233",
+"333>>>>>>>>>>>>>1,,,,;;;;;;;;;;--------;,,>>>>-->>>>>>33,-7,-flcSFFSxllxhgchhcggzLWYLNzNKLzLYKE_EYEREEEYE^ER_RYKKKKKKKKKKKKKIYYIIIYYYYYYYYYYYYYYWKKLHNzxzzFFFFSSHHHHHHHHSzSLLLzzxzSzzHLJJJJJJJHHJJJJJJJJHHHJJJJJJJJJJJJJJJJJHBBnBBHHJJJJKKIKKKKJJJJJJJJKJJJHHJJKJJJJJJKKHLJJJJJJHzzHJKLHzzzHJIYYKYEYIKJHHHBzzzxxzzzzzzxxxxxxxxxxzzNHHNzNzHHHHLLHNBNNNBBBBBzxllcchhgyygghlllxxxlcSxlhf7-X,;;;1333->323773-->>3>--<;-;;;;-1,,1,;171119fgggclxSSFFFHFNNFNNzzzzzzzzzxzzzzzzFHHHHHFNNLLHFFFHLHHHHLLLLKKIWWIIWJLLJKWWKEKHJKJJJJKJJKIIIEYYIIKKKJKKKJJJKKKKIKKKIIIYYYYYIYYIIKKKKYYYYYYYEEEYYYYYEEYYIYYYYEEEEYYIIPPPPPPIIIIIIIIIIIIIIPPPPPPPPPPPKPKKKKKKKKKJJJJJJKIIKKKKKKKKJJJJKHJKIIIKJIKKKIYIKKIIKKIKKKIKJJJKKIIKKIIKKKKKKJJJJJJJJJJJJHHHHHNzzzBHHHBNzBHHHHHHHHHHHBBBBBBznBBBBHBHHJLHHBHHHHHHHHHHHHHBBHHBzzznBzzzxxxzznnBBBBBBBHHHHHHJHHHJJJJJJJHHHHHHBHJJJKKPJKKPPPKJKKJKPIIIPPPPPPKKPKJJJJJJJJJJJJJHHBBHHJJJHJJJJJJKJLJJJLLJLJJJJJJJJJLLLLLLJJJLLHHHLLLLLLLLJJJLJJJJJJJJKKKKJKKKJLHHHHHHHHHHBHBzBHLJJKKKKLHHxhhhccxLx7-;---3;gc91996.XX.9ff9761.XXXX...X.XXX111333>>",
+"---;;;;111;;;;11;;;;;<,,;;;;;;;;,,,,1111---;,111;;;;XXX.;X;.XcYR(}[])RYWHLKFHYYEHHHKYYKHIYKYTYYETR^_RR___)RERYKKJKKWWKJLKJJKKKKKKKIIYEEEYYYIKKJJHFNzzzxxzzzSFHFFSSFFFHHHzxzHKKLLHLHHHHHnHHnnBBBHBHHHHBBBHJJJJJJJJJJJJHBBBnzzzzxxxxxxzBBBBHHHJJKJJJJJJJJJHHBzxxxxnzzzzznBzzzBHHHHHzxzHHHHzxzzHLLHNHLJKKKLNzzzBHHHHHFzzzzzxxxllxzzxxxzzzzzNHHzNBzxzzzxxxxlhhhhhhhhhhhhccllllllllllllxxSSxl711;;.XX1-.-;--;777hllgf771111;.X.;;;167hclxxxxxzFLLLLLLHHHHHFFzFFFSzzzxxzzzzxzzzzzzzzzzxxxxxzzFFFFHHLLLKWYIIYYIYYIYYIKJIJHJKJJIJJJJKIEETTTTEYIIIIKKKKKIKIIIIIIIIIYYYIIIYYYIIIIIIIIIYYYYYYYYYYYYEYYYYYYYYYEEYYYIIIIIIIIEIIIIIIIIIIIIIIIIIIIIIIIIKKJJJKIIIIKKKKKKKKKKKJJJLLHHBBHHHHJJJJJHJKKIIIIIIYYIYYYYEEEIIIIIIIIIYYIIKKKJJJJJJJJJJJJJKKJLLLHHHHHHHBBBHHHHHHHHHHHHHBBBBBBBBHHHBHHLHHHHHHHHBBBzzzzzBBBBBzzzBHBBzzzzzzznBBBBHHBBBBBBHHHHHHJJJJJJHHHHBBBBNBJKKIIIIIIIIIIIIPPPIIIIPPPPPPPPKJJJJJJJJJJJJJJJHHBBBBBBHJJJJJJJJLLLHHHJHHLLJJJJLLLHHHHHLLLHHHHHHHHHHHHHLLLLLLLJJJJJJJKKJKKKJLLLHHHHHHLLJJLHHJKKKKKKJJHHhv99ghghDg91171XfL(YKEEKxxxzLKKLLLLLLHFFxlcchgf9.XXXX---",
+"11..XXXXXXXXXXXX...XXXX.........--------71;;;111169ghlxSxxSxlK))WKKWYLzxHLLxzKERYKNxxHYRE^__RE^^ER_)RR__RREYYKKKKKKKKLLLKKKKKKKKKKKKKWWWKKJLHHHHFFFNzzzzSSFHLLHFSFHFFHHFHzxxzFHNHHBHHJJHBBBBBBBHJJJJHHJJBBBHHHHHBBBBBBBBBnzzzzxxxzzznBBznBHHHJJJJJJJJJHHHHHBnzxxxxkkkxxxxlclzHHzHzxxzzFHHHHHHHNzHNzzzNzzzzzzHLKKHHHHHHSzHHSzzzzHzxxxxxzzzzxxxxccllllcchhhhcclxxzllllccccccchhhhcccccllllcchhhhhh9769ghcxlllSFSxxxxxxxlllccg79hcghxzNzxxxzzFFFzzzxxxxxzzzxxxzxxxxzzzzzzxzxxxxzzzNSHHLLLLLHHHHLJJJIYYYYYYYYYYEYWLNJKJKYKJKJKJJKIETETRRRTEEIIKKKKKKKIIIKKKIKIIIIIKKKKIIIIYYIIKIIYIIWYYYYYYYYYYYYYYYYYEEEYYYYIIIIIYTYYYYYIIIIIIIIIIIIIIIIIIIPKJJJJKKKKKJJJJJJJKKJJJJHHBBBBBBJHBBBBHHJKIIIYYEEEEYETTEEEEYYYYIYYYYYYYIIIIKKKKKKKJJJJJJKKKJLLLLLLLHHHHHHHHHHHHHHHHHHHHHBBBBBBBBBHBHBHHHHBzzzzzzzzzzzzzzxxzzzzzzBBnBBBHHHHHHHHHHBBBBBBHHHHHJJHHHJHHHBBBBNBJKKIIIYYYYYYYIIIIIYYYIIIPPKJJJJJJJJJJJJJHHBBBHBBBBHHHHJJJLHHHLLHHHHHHLHHHHHHHLHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHLLLJJJJJJJJJJJLLLJJJJJJJJKKKKKKIKIPJJJJJHchh9hhhhxhggff999lLKKKWIWYYYYWKKLKYRRRRRREEEYYWKHzch9966",
+"WKLFzxllllxxxxllcchhggggfffff99999999997;;17hxFKKKKWYYYYYEEYKYWLHzxxnzxxzKYYYEEKKLzHKEEYKYERYKYKKKYYKKKKWKKKLKKKKKKKLKKKLLKLLLKKLKKLHHLHHHFFFFFHHHHHFFSSFFHLLLLLHLLHHLHHzzxlxzHHJHBBBBBBHBBJJVVVHHHHHHHHHHHHHHHHnnzzznBBBBBBnnzzBHJJJJHBHJJLJKKKJJJJJJHHJJJJJHHHzzzxzzxxxlclxzHzFzxzzxxzzzzzzzzzzzzzzzzzzzzzzSFFzzzFFzzzzzzzzxzzHNxxxxxxxlcccchhhcclxxxxzzzzxxxxllcccccchhhcchhhcchhhhhggghlxFLLKKLHzxzFzxxxlclzxxxxxxxxFlg9gcllzBJJHNBHxxxllccclllllxzzxxzzNNNNNNNzzzzzzxxxzzNBzSHHHHHHHHHHLLLLKKWKKKKKWWYYEYWKKEIITYKIKKKKKIYYIYETTEEEIKKJJJKKJKIKKJKKKKKKKKKKJJKKKKKKKKKKKIIKWWYYYYYYKWYYWYYYYYEEEYYYYYYYIIIIYYYYYIIIIIIIIIIIIIPPPKKKKJJJJJJJJHHHHHHHHHJJJJJJHBBBnnBBBBBBBBJJKKIIIYETEEEYETEYIYYIYYYIYYIIYYIKIIPKKKKKKKKJJJJJLLLLHHHLLLHHHHHHHHHHHHFSSSHHHHHHBBBBBBBBBHzHzBzBzzzzzzzzzzzzzzBBzBHBBBHHBBBBBHHHHHBBBBBHBBBBBHHHHHHHJHHHJJHHHHHHBHJJKKKKKKKKIIIIIIYYEEYIIIIKJJJJKJJJJJJJJJJHBBBHBBHJJJJJJJJHHHHHHHHHHBBHBBHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHLLLJJJJKJJLLLLLHHHJJJJJJKKJJJKKKPKJHJKKJKKWLSxchg767996glzHHHLKIJKKYYYYEYETRRRTEIIIYETEEREYYYEEE",
+"EEEERR}_RR}}}}RR(((REEEEYWWWWLLLWWWWLLLLWLSSSLWWLLLLKKKLKKKKKWLNzxxHJKKKHKLKKKEYLKKLLLLLLH|LLHKLKLLLHHLLLFLLHHLHLLHHHHHHHLLLLLLLLLLHHHHHHHFFzFFFNFFFFFFFFLLLLLLKLKKLLLLHHLLNzHHHBBHJHBBBBBVJCVVCHHHJJHBnBBBBBBBHBnnzzznnnnnnznnnHJJHJJKKKIKKKKKKKJJJJJJJJJHHBBHHBBBBBBnzBnzxclxzSzSHSxlxxxxxxzHHHLKLHFzzxzzzzxxxzzzzzzxxzxxxlxzFLNxlcclxxchhchccccccllclcclllllxccccccchchhhcccccchhhhhghclxSFHLzLKLzxzzxhhczNxllxxzxxzzxg9hlclFBBNBBzzxzzzzxxzzDxxlllxzzNNNNNNNFFFFFFSSzzxxxzNNzzzzzzHHzzzBHHHBNHHNNNBBzzzNHKWWHKHBIIJIIIIIIIIIKIIYIIIIIIKKKKKKJKIIKKKIIKKKKKIILLJLHHHHJKKKKKKKKWWYYYYYYYYYKWYEEEEEEYYYYYYIIIIIIIYIIIIIIIIIIPPPPPPJJJJJJJJJJHHBHHHBBBBBBBBBBBBHBBBBnznBznBBJJJKJJJJKIIEYYYYEEIIIIYIYYYIYIKKKKKJJJJJHHJJJJJJJJJJJJJLHHHLHHHHHHHBHHHBBFzzHHHHHHBBBBBBBBBBzBzHzBxxzzBBzzzzBBBBBBBBHnzzzBBBHHBBBBBBHHBBBBBBHHHHHHHHHJJJJJJJJJHHLLLLHLJJJKKIKKKKKIIIIIIYYIIPIIIKJJJJJJJJJJJHHHHHHJJKKKKIIKJJJJJHHBBBNBBHHBzNBBHHHHBBHHHHHHHHBBBBHHHHHHHHHHHHHHHHHHHLLLLJKKKKKJLHLLHHBBHHJJHHHHHHJJKJJJJHJIIIxxzHKWWLxzzxLWLLHLHzHKJBLHHLKYYYYIKKKKIYIIPIIIIKKKKYETEY",
+"KKYYYYYYYYYEYYIKIIWWWWIYKKKKKJJLKLLKKWYYYWKWYRR}RKBzzzHJLJKKKLHzFFFFHLKWLLFzzFHLHFFFFFFFHHHFFSSSFFFSSSSSSFHHHFFFFFFHHHFFSFHLLLLLHFFFFHLLHHFFFFSSzzFzzzFHHLLKKKKKFHLLLLLHHHHzzzBHLHHHHHHHLJJKKKKKKKKJJHBBzBHBBnBBnnzzzzzzznBBBnBBHHHHJKKIIIKKIKKKKJJJKKKJKKKJHHHHBBBBBHJKKJHNzzzzLHzzxzzNHzzxxzxxzzzzzzzFzzzzzzzzzzzzxlcccccxFHzxccchccclllllllcclccccllcccccccccccccclllcclllccclhgcchhcclxzzzzzNxxzKlNzxxxzzxzzzzxxzzzHxzxxznzBzzxxNNzFLFzxxlllccxxhczzLLLLHHHHFFSzzxxzxxxxxxxxzzxxzzzzxxzxxzzxzBHNxxzHNLHllNJLIIIIEYIPIIIIIPKJIPPIIYEEIIETEIPJKKIIIIIIYYYEYYIIKKKKKKJJJJJJJJJJJJKKKKIIIIKKKIIIIIIIIIIIIIIIIIIIIIIIIIIIIIPPPPPPJJJJJJJJJJJJJJBBBBBBBBBBBBBBBBBBnnBBBBBBBBJJPPKJJJHHHHHHJJJJJJJJJJJJJJHHHHHHBBBBBBBBBBBBBBBnnnnnBBBBBnzzzzzzzzzznnnBBBBBBnnnnnnznnnnnBBBnnBBBBnnnnnnBBBBBBBnnnnnzNNBNNzzzzBBBHHHHHHHHHHHHHHHHHLLJJJJJJJJJJJJJJJJKKKKKPPPIIIIIIIIIIIIIKKKKKKKJJJKKLLJKJLHJJLJKKKKIKKKKKJJJJLHHHHHHHBBzBBHHBBHHHHHBHHHHHHHBBBBBBBBHHHHHHHHBHHHHHHJJJJJJJJKJKJHHJJHHHHHHHLJHHSllzxzHzFSlxHHFzzNHLLLPPPPPKKKKIIIKKKPKKKKJJLLLJJKKKKJKKKKKLHHLKWYYWWY",
+"KKIIYYYYYYYYYYIKYIIWWIYYKKKKKKKKLLLLLKKKWKKKYERREWLHHNzNHHLLLHNzFNNNNFFFFFzzzFHLSSSSSSFFzzzzzzzzFFSzzzzzHHHHHFFFFFFFFFFFzFFHHFFFHHHFFFFFLLLLLHFFFFFFzFHLLLKKKKLLHHHHFzzxLLHHzzznBBBBBHHHHLJKKKKKJJJJJJJJJJJJHBBBBBBBnnnnznBBBBBBHHHLJJKKKKKKKKJJJJJJJJJLHHBBzzzzBBBNzzzzzzzBBNzzlxxzzzxxHFxlccccllxxzzSFzzzzzzzzzxxlhhhcHKLzchhhcccccccccccccccccclllcllcccllllccccccllllllllllllhghhhhhhhhhhcxFHLKKJNzzzzxxzxzzzxhhhclzxzxxBzxzzzzxzzzFzxlcccclHzHLHHLHHHHHHHLJSHFzzxxxzxxxxzzxzzzzFzzzlxxxxxxxzzzxxlxxlzHLY}_}RRTTIIIIIIYIIIIIKKKKKPPPIIIIIPKKKKKKKKKKIIIIIIKKKKJJJJJLJJJJJJJJJJJKKKKKKKKKKKKIPPPPPPPPPPPPPPPPPPKKKKPPPPPKKKKKJJJJJJJJJJJJJHBBBBBBBBBBBBBBBBBBnnBBBBBBnBBJJJJHHHHBBHHHHHHHHHHHBBBBBBBBBBBBBBBBBBBBBBBBBBBBnnBBBBBnzzzzzzzzzzzzBnnnnnnnnnnnzzzznnnnBBBBnnnBBnnnzzznnnBBBBBBBBBBBBBBBBBBBBBBHHHHHHHHHHHHJJJJJJJJJJJJJJJJJJJJJJJJKPPPPIIIPPIIIIIIKKKKKKKKKKKKKJJKKJJKKKJJJJJJKKIIKKKKJJJLHHLLHHHHHHHBzzzzzzzHHHHHHHHHHBBBBBBBBHHHHHHHHHHHHHHHHHLJJJJJJJKKJKJJJJJJBBHHHHBzLHHzzSxlzSSxxxzHxzHLLJKKJKKKKKKKKIIIIIIIKKKKJJJLLLJKKKJJLLLLLHHHHLKKKKKW",
+"KKKKKKKWYIKKKKKKKKKKKKWWWKKKKKKKLLLLLKKKKLHHHLLHLLLLLLHNxzzzzzzxxzzzNNzzzzzzNFFFFFFFFFHHFHHHHHHHFFFSzzzzxxxxxxzzzzzzzzzzzzzzzzzzzzFFFFFFHLLLLLLHHHHLLLLLLKKKKKLLKLHHHHHHHHHHHBHHBBBBBHHHHLJJJJJJJJJJKKKKKKJJJJJHLHHHBBBHHBBHHLHHHHHLJJJJJLHHHHHHHHHHHBBHHHHHHHHHKKKJHBBBBHHHBzxlzxxzzBzzzzxlchclzzHHLLLLzzzzzzzzllcchhclxxxchhhhhccclllllcccccllclccllccllllllcccclllllxxxxxllllchgghhhcghhhccxzHNHLLRFxxxxzFzzxHxhhcllxSHzzHHzBzNNNzzzzzSzxlxSFLNzHHLLHzFHLLHzzzFFFHHzzzzzzzzzzxxxxzxxzBHHHHBNNxzxxllccccclzKIITTTTIKPIPIIIJJJJIIIKKJJJKKKKJJJKKJJJJJJKKKKKKKKJJJHHHHHHHHHHHHHHLLLJJJJJKKJJJJKKJJJJJJJJJJJJKKKKKKKKKKKKJJJJJJJJJJJJJJJJHHHHBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBnBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBzzzzzzzzBBBBBBBBBBnnnnnnBBBBBBnnBBBBBBBBnnnnnnnnzzzzzBBBBBBBBBBBBBBHHHHHHHHHHHHHHHHLLJJJLLLLLLJJJJJJJJJJJJJJJKKKPPPPPIIIPPPPPPKKKKKKKKKKKKKKKKKJKJJKKKJKJKKKKKIIKKJJLHHLBBHHHHHBHHHBBBBBzzzzHHHHHHHHHBBBHHHHHHHHHHHHHHHHHHLLLLLJJJKKKKKKJKKKKKKKKJJJJLHzxcxzzSxczHSxzzxHLLLHLLLLJKKKKKKKKKKKIIKKKKJJLLLLHHHHLLHHHHHHHSzzHHLLLLLK",
+"HHHLLLJKLLHHHHHLLLLLLKKKKKKKKKKKKKKKKKKKWKKLLHHFzHHHHHHzxxxxxxxxxxzzFFFFzzzzFFzzzxxxxxxxxxxxxxxxxxxxxxxlxzzzzzzzxxxxxxzzzzzxxxxxxxzzzFFFFFHHHLLLHHLLLLLHLLLLHHHLLHFFHLKJHHHHHHHHHHHHHHHLLLJJJLLLJJLLJJJJHHHHJJJJJLHHHHHHLHLLJJJLHHHHHHHHHHHBBBBBHHHHHHHHHHBHHLLLKKKJJJLHHHHHHHBBHBzxzzzzxxxxxxxxzzFHHHHFzzxzzzzxllllcclllchhlllccclxxllllllcccccllhhxxccllllllccllllllllllllccllghhggghhcccclxzHLWWYHYzzzzzFFFFFHSxxSSSHSzzzSzzzFFFFzzzxhchhhhchcccccclllllxxxzHHHFFLKzlxzzxllxzxxxxzxxzzzBHHBzzzzBBBzzzNzxxzzzzJIIIIJJJJKIIYIIIIIIIKKJJKIIIKKKKJJJJJJKKJJJJJJJJLHHHHHHHHHHHHHHHHHHHHHHHLLLLLLLLJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJHHHHHHBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBnnnnnnnnnBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBnnnnnnBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBnnzzzznnzzzznBBBBBBBBBHHHHHHHHHHHHHHHHHLLLLJJJJJHHHHHLLLJJJJJJJJJJJJJKKKKKKKKKKPKKKKKKKKKKKKKKKKJJJKKKKJJJJKKJJKJKKKKKKKKJJLHHBHzzzBBBBBHHHHHHHHzzzzBHHHHHHHHHHHHHHHHHHHHHHHHHHHHHLLLLLJKKKKJJJJJKKKKKKJJHHHLJJJLxch99h9hchhhhhclcclzHLLJJJJJKKKKKJJKJJHLLLHHHHHHHHHHHHHHHHHHSzzzSHHHHHH",
+"zzHHHHHHzzzzzNHHFHHHHLLLLLKKKKKKKKKKKKKKKKKKKKKLLLHFzzzxzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxzzxxxxxxxxxxxlllxxxxxllllllxxxxxzzzxxxxxzzzzzzzzzzzzFFHLFFFHHHFFFFzzzzFHLHFHHLLHHHHHHHBBHHHHHHHHHLJJLLHLHHBBBHHHHHHHHHHHJHHHHHHHHLJHHHHHHHHHHHHHBHHHHBBBHzzzHHBBHHHHHLLLJJJJJJJLHHHHHLJKLHHHHHzxzzzFFzxxllxxzzzzzxxxxxxxxllllccccllllllllllxllccllllccchcchhSFxxlllllllllllllllcccccclllxxxlcccclxxzzHLLKYKKHzzxzzxxlxzSSFFSSzzHFFHHHFzzFzzzxxzxxxlhhcchhclzzxlllxxxxlxzxzxxFHzxxxxxllxzxxlxzzxxzNHLJJJJKIYEYYYEKJBBBBBHJPITIIKKJJJJJJJHJJKKKJJJIIIIIKKKJJLLLJJKLLLHHHHHHHHHHHBBHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHLLHHHHHHHHHHHHHHHHBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBnnnnnnnnnnBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBnnnnBBzzznnnnnBBBBBBHHHHHHHHHHLLLLLLLLLLLJJJJJJJJJJJJKKKKKKKKKKKKJKKKKKKKKKKKKKKKKKKKKJJJJJJJLJLJJKKJJLLJJJJJKLJKKJLLJLLLHHzzzzxxxzzHHHHHHHHHHBzzzzzzzBHHHHHHHHHHHHHHHHHHHHHHHHHHHLLLLJJJJLLHHLLLJLHHHHHHHHLWYHNLKzcc9969v99hhhhcxHHHHHHHHHLLLLLLLLLHHHHHHHHHHHHHHHHHHLLLHHHHHzSFFSSzS",
+"zzFFSzzzzzzzSFFFzFFFHHHLLLLLLLLLLLLLLLLLHHLLLLLLLHFzzzzzHFFFzzzFFSzzxxxxzzxxxxxxzzxxxxxxxxxxxxxxxxxxxxxxllxxxxxxlllxxxxxxxxxxxxxxxxxxxxzxxzzzzNHFFSzzSFFSzxxxzFHLLLLLLHHHHHHHHHHHHHHHHHHHHLLHHHHHBHHHHHHHHHHHHHHHHHHHHHHHLJHBBBHBBBBBBHHHHHHHHHHBzxzBBzzJJJJJJJJJJJJJJHHJJLLHHHHHHHLJLHzHNzzSzzxzzzzzFFFxxxxxxllxlllllcchcccccclcccccccclllllccchllxFzlxlxxxxlllxllllllcclllxxzSFHHFFFzzxzFHHHFFFzlxFxFxlxxxxzzzFFSlchclLFSxllzzxlllclSzFzxllxxxzzzHKLFFSHKKLzxllxllllxFxlllxzxxxzxxnHBnzBHBBHHBHJKKKJJJKJBBzzBJJBJJJBBBIJBBBBBBHHJJJJJJKKKJJJJKJJLHHHHHHHHBBBBBBBBHHHBzBBBBBBBBBBBBBBBNBBBBNNNzNNNNNNNNBBBBBBBBHHHHHHHHHBBHHBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBnnnnnnnnBBBBnBnnnnnnnBBBBBBnnBBBBBBBBBBBnnnnnBBnnnBBBBBBBBBBBBBBBBBBBBBBBBBnzzzznnnBBBBBBBBBBBBBnnBBBzzzznnnBBBBBHHHHHHHHHHHHLLLLLLLLLLLJJJJJKKKKKKKKKKKKKKKKKKKJJJJJKKKKKKKKKKJJJJJJJJJJJLHHHHLLJJLHLHHLLLLJHLLLLHHHHHHHBzzzzzxxxzHHHHHHHHBzHHBzzzzzBBHHHHHHHHHHHHHHHHHHHHHHHHHHLLLLLHHHHHHHHBBHBzzzNHHHNNFHLHzzchchcvhxxxzxzFLLHNNFHFFFHHHHHHHLLLLLHHHHHHHLLLLLLLLLLLLLLLLLHHFFFSSS",
+"SFFFSzzzzzzzSFFFzNNFFFFFFFFFFHHHHHHHHHHHLLLLLLHHFxxzFFFHFFNzzzzzzzzzzzzzzxxxxxxxxllllllllllllxxxcccccccchhhhcccclcccclllclllllxxxxxxxxxzxxxxxxxzzSSzzzFHzzzzzzFFFFFFFFHHFHHHHHHHHHHHHHHBHHHHHHHHHHHHHHHHHHHHHLHHHHHHHHHHHHHHBBBBzzBBBBBBBBBBzzBBHzzBHHHHHHLHBBBHHHBBHHHBHHLLLHHHBzzzzzzzFzzzzzSSFFSSFSzzxxxxllxxxllllllllllllllclccccllllllllllllxxxxxllllxxxxxxxlllxxlllxxxzzSSzzzzSzzSFzxxxxzzzFHSzxzFzSFFHHSxxxlcccclFxlhvgcllcxxclzzzxxxxzSSzzlxFzxzzzzzzzFFHFzxlccxxlccllchzJJHJIKJKYIJJKKJPIIIYIIIPIIIIJHBBBBBBzznBzxxxzBBBHHLHHHHHHHHHHHHLLHHHBBBBBNzzNNBBNNNBBNzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzNNNNNBBBBBBBBBBBBBBBBBBBBBBBBBBBBnnnnnnBBBBBBBnnnnnnnnBBBBBnnnnnnnnnnBBBBBBBnnnnnnnnBBnnnnnnnnnnnnnBBBBBBBBBBBBBBBBBBBBBnnzzzznnnBBBBnnnnBBBBBBBBBBBBzzBBBHHHHHHHHHHHLLLLLLLLLLLJJJJJJJJJJJJJJJJJJJKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJJJLLLLLHHHHHHHHHHHHHBHHHHHHHHHHHBNzBBBzzzzNzzzzNHHHLLLLHHHHHHHHHHBHHHHHHHHHHHHHHHHHHHHHHHHHHHHLJJLHHHHHHFzzzzzzxxxxxxxlccccxlxxzHNSllzHHHLSSFzzzFHFFFFFFFHFHHHHLLLHHHHHHLLHLLLLHHLLLLHHHHHHHFFFFFF",
+"FFFFFFHHFSSzzSSFSSzzzzzSSSSFFFFFFFFFFFHHHHHHHFFFFxxzFSzSSSzzzzzzxxxxxzzzzzxxxxxxxxllccccccccccclccccclllxlcccccccchhccclllxxxxxxxxxxxxxxxxxxxllxlxzSzzzFxzzSzzzSSFFFFFHHLLLHHHHHzzzzzNzzBHHHHHHHHHHHHHHHLHHLLLHHBBBBBBBBHBzzzzzzzznBBBBBzzzxxxzzzxxznzBHHHJHBzBHHHHHLJJLLLJLLHHzBBBzzzzzzNFFzzSFFFSFFzzxxxxxllxxxxxxlcccclxxxxzxzxxlcllllllllllxxlllllxlllllllllllxxxxxxxxxxxxxxzxxzzzzzxzzFFFFFHzHzFKFSLFxlllcgggglSFSSzxxlhhcccczFllzxxxxSSzxxxxxxzlclxxlxzSFFFzxxzxlzzzzxchhhcBJBHJJHKYIJJIIJIIIITTTYTEIIIIIPTTTTEIIIKJJHBzzzzBHHBBBHNBHLLHHHHHHHHHBBNNzzNBHHHNzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzNzzzNBBBBBBBBBBBBBBBBBBBBBnnnnnnnnBBBBBBBBBBBBBBBBBBBBnnBBBBnnnnzzzzzzzzzzzzzBBBBzzzzzzzzzzzzzBBnnnnnnnnnnnnnnnnzzzzzzzBzzzzzBBBzzzBBBBBBBBBBBBBBBBHHHLLLLLLLLJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJKKJJJJJJJJKJJJJJJJJJJJJJJJJJJJJJJJHHHHHHHHHHHHHBHHHzzzBBBNNNBHHHBzzzzzzzNHBBBBBHHHLLLJKKKKLHHHHHHHHHLLLLHHHHHHHHLLLJJJJLHHHHHHLJJJLHHHHFzzzxxzxxxxxlllllllNLzxzNLFLzcczzxFzxxxFHFzSzzzzSFFFFHFFFFHHHHHHHLLHLLLLHHLLLLHHHHHHFFFFFFF",
+"FFFSSSFFSSSSSzzzzzzzzzzzzzzzzzzzzzSSFFFFFFFFFFFFFFSzzzSSSSzzSzzzxxxxxxxxllxxxzzSxxxxxllcxxlllccccccccccccccccccccccccccccccccclxllllxxxxxxxxxxxxxxxzzzzSzzzSFFFFFFFFFFFFzFHFHHHHHBzzzzNHHHHHHHHHHHHHHHHHHHHHSzzzzNBzzNBNzBBBzzzzzzzzzzzzzzzzzzzzzzzBHHHHLLHHHBBBNBHLHHHHHHHHHHBzzzzzzzzzzzzzzzSSzzzzzzzzxzzxxxxllllccccclllxxxzzFFFNzxxzxxxxlxxxxxxxxxxxxSxlxxxzxSxlxzzxxxxxxzzzzzzzzFFzFzzFzxxzzSFFFFSzlchgg99gghcllxxzxxxxzzzzzzSFFzxlhcxxxxxxllxxllxxSSFHLLFSFzxxxzHHLLHHFzxxzznBBBBBHJJKJKIEYIIIIIIIIIIIIYYYIIIIERTEIIIYKJJIIYYJBNzzHHHHHHHHHHHHHHHHzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzNBBBBBNNBBBBBBBBnnnBBBBBBBBBBBBBBnnBBBBBBnnnnBBBBBBBBBnnnnnzzzzzxzzxzzzzzzzzzzzzzzzzzzzzzzznnnnnnnnnnnnnnnnzzzzzzzzzzzzBBBBBBBBHHHHHHHHHHHHHHHLLLLLLLLLLLLLLLLLLJJJJJJJJJJJLLLJJJJJJJJJJJJJKKKKKKJLJJJLHHHHHHHJHBBHBJHzHnzHHzzzzHLBzzBHBzzzBBNzxzzzzNHHHHHHHHHNBHLHLHHHHLHHHLJHHYIzLKKJLLLLKJLLLLLHHHHHLLLLLLLJJJLLHHHHHBBBHHHHHHHHzzzzzzzzxxzzzzFHFHLHFFHHHHxlchccxclcxcxzFzxzSzzxFFFFFzFHFHFFHFzFFHFzHHFLFFFFHHFFFFFFHHHH",
+"FFFFFFFFSSSSSSSzSFFFSzSSzzzzzzzzSSSSSSSSSSSSSSSSSSSzzzzzFSzzzzxxxxxxxxxxllxxxxxlxxxxllllxxxxxxxxllllllccccccccccccccccccxxlllllxlllllxxxxxxxxxxzxxxxxxxzSSSFFFSzSFFFFFFFxzzzNHHHHHHHHHHHHHHHHNNNHSSzzSSHzSHHHSzzzBzzzzzzzzzzzzzzBHHBzzzzHBBBBBBHHHHHHHHHLLHHHHHHBHHHHHHHHHHHHHzzNzzzzzzzzzzzzzzzzzzzzzzzxzzzxxxxllxxxxxxxzzzzzFFFFFzzxxxzzzSSSzxxxxxxxxxxxxxzxxxzSSzzxxSzzzzzzzxxzzNHHLLHzxlchcxHHFFSSxxg99ggggclllllllxSSzSFFzzzzxxxxxxxxxxllxxxxzzzzNFFFHKWWKLHHzzzzzzFFHHHHHHLLJLHHHHHHHHHJKIIKJKKPIIIIIIIIIIIIIKKIIKIKJKJHHKLKJHzzBzHHHHHHHHFFFFNNzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzBBBzBBBBBBBBnnnnnnnnnnnnBBBBBnnnBBnBBBnnnnBBBBBBBBnnnnnnBzzxzzzzzBzzzzzBzzzzzzzzzzzzzzzzznnnnnnnnnnnnnnnBBBBBBzzBBBBBBBBHHHHHHHHHHHHHHHHHHHHLLLLHHHHLLLLHHHHHLLLLLLLLLLLJJJJJJJJJJJJJJJJJLLLJJHHHHHHHHBBBBBBzzBJzHzzHBxzHHBzzzBzzzzzzzzzzzzzzBHNLHHHHHJKJKKJJKJHHHHHHHHHHLLLHLLzKKYKKKJLJJLLJJJLJJLLJJJJJJJJLLLHHHHHHBBHHHHHHHHHNzzzzzzzxxxxxxxzLKKKLKKKLKFFFzFzFHKLHxllllllxxSFzxxzFFFSSFzzzSFHFLFSFFzFHHHHHHHHHHHFFFFF",
+"FFFFFFFFFFFFSSSSzSSSzzzSSSSSSSSSFFSSSSSSSSSSSSSSzSSFFFFFzxxlllllxxxxxxxxxxxxxxllllllllxxlcccccccccccccchllllllllllllxxxxxxlllllxxxxxxxxxxxxxxxxxxxxxxxzzFFSFFSzzSSFFFFHHHLLLLLHHHHHHHHHFHHHFzzzzzzzzzzSSzzzSzzzzzzzzzHHNzzzHHHLLLJJHHHHHHHHHHHHHLLHHLLHHHHHHHHHHHHLHHHHHHHHHHHHzBBzzzzzzzzxxzzzzzzzzzzzxxxxxxxxzxzzzzzzzzzzzzzzzzzzzzzzSzzzxxxxxxzxxxzzxzxzzxxxxllxxlccxlllxxxxxxzHLLLLLWHxlllxzxzzxlhf699fhccclllllllxFFFFFFFzzSzzzzSFFFFzzxzzFzzzzzzzxzxzFLLHFHHHHHHBBxzzzzzzzHHHBzzznBBBHBBBBHHHHJJJKJKKKKIIIIIKJJKKJIKLLLHBBzzzxxzNNzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzBBBBBBBBBzzBBBBBnnnnnnnnnnnnnnnnBBBnnnBnnnBBnnnnnBBBBBBnnnnnnnBzxxzBzzBNxxzzzzzzzzzzzzzzNzzzzNzzzznnnnnnnnBBBBBBBBBBBBHHHHHHHHHHHHHHHHHHHHHHHHHHHHHLLLHHHHHHHHHHHHHHHHHHLLLLHHJJLLLHHHHHHHHHHHHHHHHHHHBHHHBBzzzzzzzzBHBHzxzzxzBHHHzzHHNzzzHHHLLHHBHJLHJJJJJKKKKKKKKIKLJJJJLHLLHHLKLHLJKIYYIKKKKKJJKKKKKJJJJJJJJJJJJLLHHHHHHHHHHHHLHHHHLLHHHHHHHHHHFFFHzzxxxFLLFLHzcygg9ghghcxxxxSSxllxxFFFzxxxxzzzSSFFSFSzFSzFzSFFSSSSFFFFFFFF",
+"FFFFFFFFFSSSSSSSxzzzxxxzFFFFFFFFFFFFFFFFFFFFFFFFSFFFFFFSSzxxxxxxxxxxxxxxxxxxllllllllllllxxxxllllllllllllccccclllccccccccllllllxxzzxxxxxxzxxxzzzxzzzzzzzSzzzzFFSzSFFFFHHHLLLHHHFSFHHHHHFNFFHFzzFHHHHHHHHHHHFNzzzzzzzzBHHNzHHHHHLKJJJJJJJKLHHHHHHHLLLHHHHHHHHHHHHHLLLLHHHHHHHHHHHHBBBBzzNzzxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzSSFSzzxxxxxllxxxxxxlxxlxxchhlxxxzHllxzzFNzHHHNBLKYzxcxzFFFxlh99996hhhlllllxxxxllxzFFFFFFzzzzzzzzzzxxxxxxxxFFNNNNzzFNzzNHHHHHHHHHHHLLLLLLLLHHHBzNHHLHBBBBBBzzBHLHHHJJKKKKKKJKJLHJJJKJHHHBzzxzzxxxzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxzzzzzzzzzzzzzzzzzzzzBBBBBBBBBBBBBBBBnnnnnnnnBBBnnnnBnnBBnnnnBnnnBBnnzzBBBBBBBBBzzzzzBzxxzBBzzzxxzzxzNNNNNNNNzNBBzzzBzzzzznnBnnnBBBBBHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHLLLHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHBBHHBBBBNBBzzzzBzzHLHzzxzLzzNHzBHHNzzNHLLLIKLHHJJJLJKKKKKKKKKKKKKJLLJLHHHHHBHJHHLKLJKKKKKKKKKKKKJJLLLLLLLLJJJJJLLLLLLHHHLLLLLLLLLLJJJLLJJJKKJLHHHHlchhhlxxFl99ghchghhggccglxzxlhhhcclxxxxSxxxzzzzxzzzzzzzFzzSSzzzSzzzSFFFF",
+"SzzzzSSSSSSSSSSSzSSSSzSSFFFFFFFFFFFFFFFFFFFFFFFFFFFFSxxxxxxzzSzzxxxxxxllxxxlllxxxxxxxxxxlllllllllllcccllxxxxxzzzxxxxxxxxlllllxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzFFFFFFFFFFFFSFFHHHHHHHHHHHHHHHHHHHHLLLLLLHHHLHHHHHHLHHHHHHzzHHHBzzzHJJJJJJJKJJJLLHHHHHHHHHHHHHHHHHHHHHHHHBHHHHHHHHHSNNzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzFFFFFFFFFFzzzxxzzzxxxlllcclxllxSlcggclhxlxllzzFzzzFHHHHxzJYEYKHzzzFFzxlxxlcccllhhclllccccclllllxxzzzzzzFFFFFNzzzNBHHNNNzNHHHNBHHHHNNNHHHHHHHBNzzzzzzNNNHHHzzHHLYJBzzBHJzzBHLHHLHLLLLLLLBBHBBHHHBzzzzzzzzzzzzzxxzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzxxxxxxxxxxxxxxxxxxxxzzzzxxxxxzzzzzzzznnnnnzzznBBnnnBBBBBBBBBBBBBnnnnnnnnBBBBnnnBnBBBBnnnBnnnBBnnzzBBBBBBBBzzzzzzzzzzzNzzzzzzBBzzzzzzzzzzzzNzzzzNzzzzNNBBNNNNNBBBHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHBBBBBHHHHHHHHHHHBHHBBNzzHBNzzzBBBzzzzzzzzHHHzxzHzxxzzzzxxxxzzNzzLHHHHHHHLJJJLLKKIIKKKKKJLJJJHHHHHHHHzzBzBHHHHHHLJJLLLLLLHHHHHHHHHHHLLLLLHHHHHHLLLLLLHHHHHHLLLJLLLHHzzxxlclllllchlg9gxHHFxSSlcchfhhhhhhhcxhgcxxzSFzzSxSFzSzzFFSSSzzSzzzzzxxxxxxxx",
+"xxxxxxxxxxxxxxxxzzSSzzSSSSSSSSSSSSSSSFFFFFFFFFFFFFFFSSSzllxxxxxxxxxxxxxxzzxxxxzzllllllllxxxzzSSSSSzxxxxxllxxxxxxxxxxxxxlxxxxxxxxxxxxxxxxxxxxxxxxxzzzzSSSSSSSFFFFFFFFFFFFHHLLKLLKLLLLLLLLLLLLLLLLHHHHHHHHHHHHHHLJHHHLLHNzBHHNzzzHJJJJJJJJJLLHHHHHHHHHHHHHHHHHHHHHLHHHHHHHHHHHHHSzzzzzzzxxzxxxxxllxxxxllllxllllllllllxxxxxxxxzzzzzzzzzzzzxzxlccclllllxSxzFlzzlhclcxcxhhlxxHHHHHHHHJLLLJKKKKYEWFlcchcxxzzxllllxxlcchhhcllchccccccllchhcclllxzzzBBHHNHLHBzzzxzNNzzzzNNNzzzzzzzzzzzNNSzzzzzNHLHNzzNBBzzzzBHHLHHHHHHHHzzzzzzzzzzzzzzzzxzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzznnnnnnnnnnnBBBBBBBBBBBBBBBBBBBBBnnBBBBBBBBBnnnnnBBBBBBnnBBBBBBnnzzzBBBBBzzzzzzzzzzNBzzzzzBzzHBzBzzzzzzzzzNBBzzzBNNNNBBHHBBBBHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHBBzHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHBBBBBBBBBBBBBBBBNBBBzzzzBBzzzzNBzBBzxxzHNzxzzzzzHzxzzNzxzzzzzzxxxzBHHHHHHHLLLHHHLJKKKKKKJKKKJJJJJLJHHHHzHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHLLHHHHHHHBzzzSFFFSzxlclzFFFxxxFFSxxxlHFHLHHLKLxhhhhclhhllcclcxlxFFSSSFSSSSzzxzzzxxxxx",
+"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzSSSSSSSSSSSSSFFFFSSSSSSSSzzzzxxxxxxxxxxxxSSSSSSSSSSSSSSSSxxxxxlllxxxxxxzzzzzzzzzzzzzzxxxxxxSSSSSSSSSSSSSSzSFFFFFFFFFFFFFFHLLLLLLLLLLLLHHHLLLHHHHLHHNzFFFFzNNFHHHHNNNNNHHHNNNHHFNHzNNNNNHHHHHHHHHHHHHHHHBBBHHHHHHHHHHHHHHHLLHHHHHHHHHHHHHSzzzzxxxxxllllccccccccccccccccccchhhhccccxxxzzzzzFFFFFFSzFzxllllxxxxxzSzxhzLWFlhghvxxczFLLLLLLJLLJJJLLLHHHLKLFzzSFFFFFLLLHFFFSxlxzxxxlchhccchhcclcccclxxzzzNBHLJJJJKJHzxxxxzzNzzzzzzzzNNNNNzzzNNNHFSzzzFHxzzNNzzxzzxxzNHHHHHHHHHHzzzzzzxxzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzNNzzzNBBnnnnnnnnnnBBBBBBBBBBBBBBBBBBBBBnBBBBBBBBBBBBnnnnBBBBBBBnBBBBBBBnzzzBBBBzzzzzzzzzzzNzzzzNzBzzBNzNBBBBBBBBHHHHHHHHFFFFFFFHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHzzHHHHHHHHFFNNNNNNHHBBBBBBBBHHHHBBnnnnnBBBzzzzzzzzzzBzzzzzzzzzzzzNzNBzxzNBHzxxxzzBFzzNNzNzzzHHHNzzzzzHLLHLzBHHLHBzzzHHLLJJHHHHHHHHLLKKLJKLLLHLLHHHHHHHHHHLHHHHHHLLHHHHLLLLJLHHHLLLJJHHHHHJJJJJHHHHLLLJKKKKKKKLLLLLKFNxzFzzLKLWLLSzSFFFFzxzllcgfghchhlxccllxclxllxxzxxzSFSzzzzzzxxx",
+"zzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzSzzzzSSSFFSzzSSzSSSSzzzzxxzzzzzzSSSSSSSSSSzzzzzzlxxxxxlllllllxxxxxxzzzSSSSSSzzzzSSSSSzxxxxxxxxxxxSFFFFFFFFFFHLLLLLLLLKKLKLLKLLHLLHFzzzNFzxlxxzxxzzNBHHHHNNNNNNzzNzzzzxzzzzzzzzzzzzzzznBBBBBBBHHHBHHHHBHHJJJJJJJJHHHHHHHHHHHHHSSzzzzzxxxxxlllllllllllllllllxxxxllxxxzzzzzFHLLLLLKLLLHFFzxllxzxxlclxxlcllgFxccxcghhhLLxxxHzzNBHHHHHHHHBHHHHFFFHLHFFFFFFHHFLLLLFzzFzzzFFzzFxxxxxxxzzzzHHHBzzzzzNzzxBBBBNxlcxxxxzzzxzzzzzzzxzzzzBHHHzzzzxzzNzzzzzzNBFzzzFHHHHHHHHLLLzzxxxxxxzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzxxxzzzzzzzzzzzzzBnzzzzznnnnnnnnnnnBBBBBBBBBBBBnnBBBBBBnnBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBnzzzBBBBzzzzzzzzzzzzzzzzNzBBzBzzBBBBBBBBBHBBBHHBBHHHFFFFFHHHHHHHHHHHHHHHLHHHHHHHHHHHHHHHHHHHHHHHzHHHHFFNNNNNNzzzzzzzzzzzBBBBHHBBBzzzzzzzzzzzzzzzzzzBNzzzzzzzNBNzzBzzzBHzxHzBHzzzzxxzzxlxxxzHHHHNNHBzHHLJJHBzzBHBzzzzzxxzBBBBHHLHHHHLJHHLLLHLJKLLLLJKLLLLLLLLLLLLJJJJJJJJJKJLLJJJJJJJJJJJJJJHHHHHHHHHHHHHHHHHHHFSSFzLFzzxSHl9ghxxSxxxxlllzcxxclzzlggch69clFlccggclhgghllllllxxxzSF",
+"lSxhcxxcxlclchhlllllllxxlllllxxxxxSSSxSFFSSSSSSxSzSSzxxSFxlxxxxzlDxlxxxxxxxlllllxllxSxlDxxSlxlxlllxxxxxSSxlllllcllllxllxlllxxxllxxxxxxxSlSFzxzzxxxSSzxzSFSzSSSzzzzzzzzzzzzzzzzzSzzzFFzzzFzllxzzzxzzzzzzzxxzzxxxxxlcclxxxzzNBHHBNNNNNzzzzzzBBLJJHLLHHWYKLKKKWIIKKKJJJLJJHHHBBHBzzzzxxxlclcllcclxxlxxxxzzzzzzzzFzzSLzzzSLzFFFFzzSSSzSzxzxxchhh9196yhcxzzxxchhxHFlhFxxzFzzzFHHHHHLLHLLHHLLLHHHHHHHLLLHHHLLLHHHHHLLHHLLHHHHHLHHLLLHHHLLKKKLLLHHHHFzzzzzzzzzzzxxzxllxBHHzzHHBzzBHHHHHzHLHHzzHHzxzHHNzHHBzzHBzxBNxxzzxxxzzzxxxzzxxxzzxzxxxxzzxxxzzzzzzzzzzzzzzzzzzzzznzzzzzzzzzzzzzzzzzzzzzznnnnnnnnnnnBBBBBnznnznnBBBzznBBBBBBBBnnnnnnnnnnnnnznBBBBBBBnnBBBBBBBBBBBBBHBBBBBBBBBBBBBBBznnnzzzzzznnnznBFHHNNNHHHHFNNHHHFFFFFFHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHFFFFFFFFFFFFFFFFFFFSSSSSSSSzzzzzzzzzzzzzzzzBBBBBBNNBBBBBBBBHBBBNNNNzzzzzzzzHzxxzHHHxxzzxxxzxlccllllxzzzzzxlxzFFzzHLHHFzzzHHHHHHHBnnHHHHHLLLHHHHHHLLJJJJJJJJJJLLLJJJJJJKKKJJJJJJJJJKKKKKKKKKKKKKKKKKJJJJJJJJLLLLLLLLJJJJJJLHHHHHHHLLKHzxxcxzxclxlxSxlccgffgg;9ghcxlcccllzLSxcccclxxxlSSxxlcx",
+"LFFSxlch769lSxhghcllchggfgghclxxllcllllxxxSFFFFFLFFFFFFSxFFzFFzSSSDSFSxSxxxxxxlllllllllxlcllxclSxxxxxSxlxxSFFSSxSxlxSxlcllllllllxxzSSSSzSSzzSFFSLFxzFFFFxxSFFFFLLLLHHFHHHHHFFFFFzzzFFFzzLLLLHLLKFFFFzzzzxxxxxlllllxxzzNNHHLLLLLHHHLJJJJJJKKKKKKJLKKJKLLKHHNHHLLHKLLJLLLHJLLHHHNzzxxxllllxxxxxxxxxzzxzzzzNNzzzFFzFFxFFzFFzFzllxzzllxzzFzFFxFHlcchghcxzFFFzFLKLzzSLFzHLHFHFFHHHHHHHHHHHLLHLLLLKLKKLLKLLKLLHLLHLLLLHLLLLLLLKKKLKKWYLKKWWWKKYWKWWKKLLHHHHHFzzLLzzFFxBHHzzBBzKJHLJJLHzKIHzHHzLHHHLLHHJJHzxzxlzzzxxxzxxxzzxxxxxzzxlxzzzzzzzzzzzzzzzzzznnnzznnnnnnnnnnBnnnnnnnnnnnnnnnnnnnnnnnBBBBBBBBBBBBBBBnnnzzznnnnnnnBBBBnBBnnnnnBBBBBBBBBBBBBBBBBnnnBBBBBBBBBBBBBHBBBHHHBBBBBBBBBxzzzzzzzzzzzxxxxxxxxxzzzzzzzzzzNFFFFFHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHFFFFHHHHHHHHHHHFFFFFFFFFSSFFFFFFSSzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzHHzxxzzzzzzzzxzHxxxxxxxxxzzzzzzxxzzzzzSHHHFSzFFHHHHBBBBBHHHHHHHHHHHHLLLLJJJJJJJJLLLLLLLLJJJJJJJJJJJJJJJKKKKKKKKKKKKKKKKKJJJJJJJJKKKKKKKKKJJKKKKJKKKKKKKKIKIYILHHlhhcggg697976799ghhghxHFxxzxxFxlxxxzFSxlclcghhcx",
+"WLFFlf11669ghgghlllclzLWFSzlcccllhgghlzFxzFLLWWYLWWKKWLLWLWWFLLFLLFFFLFFSSxxSSSxxSxlllllllclhgggghhhclxxxxxxlxFFSFFFFSSFFLFFSSSFFSSFLLLLLHFLLFFFSSSFHFSzHSxxzzxxxxzzzSFFzzzzzzzzxxzzzzzzxzzzzzzFHHHHNNzzNNNNNNzzzNBHHHHHHHHHHHHHHHHHHHHHBBBHHBBHHHNHJHBLHNNHLJKKJHHJLLJJHHHBzzzzzzzzzzzFzFFFHLLHLLLHHLLHHHHFHHHHLFzHLFFzllxxxSFFSzFFSFxzllSKLKWWKKKKLLLLzFHHSxxFLHHLLHHHLLLLLLLLLLLLLKKLLLLKKKKKLKKKKKKLKKKKKKKKKKKKKKLLKLLLLLKWKKKKKKKKKKKKWKKWYKKKKKKLYTYHHYEKIYYKKIIKYKKKIYKJzKKzzLHxLLLHHBNBzzzzxzNzxxxxxzzzzzzzxxzzxzBzxxzBxzzxzzxBzzzzzzzzBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBnnzzzznnzznnBBBBBnnnBBBBBBBBBBBBBBBBzzzzzznBBBnzzBBnnBBBBBBBBBHBBBBBnnnnnzzzzzzzzzzzzzzzzzzxxzzzzzzzzzzzzSzzSSFHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHFFHHHHHHFFSSSSSSSSBBBBBBBBzzzzzzzzBBNNNzzzzzzzzzzzzzzzzzzzzzzzzzzzBBzzxxzzzzzzzzzHNzzzzNzzzzzzzNBzzSFFSSFHSFFHHHHHBBBHHHHHHHHHHHHHHHHHHHHHLLLLLLLLJJJJJJJJJJJJJJJJJJJJJJJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKHHHJLBzzScg99hxxhf977fclhhhllcclllSSFLHHLHHLKKKKLWWWWKLL",
+"LLFFxlhgghllchhlcxLWYYYWYYKHzzzzLFSFSlh9hhcchhlxLWLSxxzzlh9gllcFFLxhcxxhcgf99glSxSxlxxxxxzlxclhglchhclxxSxxHWWKSxzFSxlxFLHFFzzzSLLFFFFLLFFHLFSzSlllclxzSxlclxzzxLLLLHFzzxxxxxxxxxxxxxxxxzzzzFHFFFHHHHHHHNNzNHHNzHHBzzzzzzzzNBHHHHHHHBBzzHBBLLHHJLJJKIKLJLHHLJKJLHzzHzzzHzzzzzzzzzzFHLHHHHLKLLLLLHHHHHHHFLLLHLLLHLLFFSSxlllxzxcclFzFzzFSHFzFHFFFFFFFzzzzzFzxzFFFFHHHHHHHHHHLLLLLLHLLLLLLLKKLJKLLLKKKKKKKKKIYKKWYYYWKKKKWWWWWWKKKKJJLLLLLJHHHLLLLLLHHHLLLHWKKLLLKKKIIKKIIKKKKIYYIJLKKKKKJJKKKKJLHLHHHHBHHHHNzNHHHHHNNNzNBzBBNNHHBzxBzxNzxNzzzzzzzznnnBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBnnnnnnnzzznnzzzznnnBBnnBBBBBBBBBBBBBBnzzzzzzznnnBnnzznzzzznBBBnnnBBBnnnnnnnzzzzzzzzzzzzxzzBBBHHNNFHNzNNzzzNHHNzzNNHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHBBBBBBBBHHBBBBBBzBBBNzNBzzHBzzHHBzzzBzzBHBNNBHHBzBNzzBHBHHHHHHHHNFHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHLLLLLLLLJJJJJJJJJJJKKKJJJJKKJJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJLLHBNzzzzNxxSHFFHFSSFFFFLLSllxxhhxlxFFFFxxzzzzxxFKFHHHLLKK",
+"FFFzzSSzxzFLHFFFJKKKKKIYIWWWIYYEEWKKKKLKxxlhv9hhxxlhhlzzz9.669y9ghg7gllhghcllhg9ghcclzxlLFxLxlhlLxlSKKKKLWYLxlFKFSzzxllxFFFFFHFFzxlchhhhxxzxxzzxxzxlzKKFzFKYEYERYYEYYKKKHHHHFSzzzzzzzzzzzzzzzzzzxxxxxxzzNNzNNNxxxxxxxxzzHHHHLJJJKKKKIIIIIJLKKJLLJTRYKJKIEYKKKJLHKHHLHzzzzNNzzzHHHHHHHzzzLKKKHFFFzFHHFFFFFHHHHHFHxzFFFFFFSFFzxlxzxxxxxSzFzxxzzzFFzzzzzFHHHFFFFFFFNFHHHHHHHLLKKLLLKLLKKKKKYKLLKKKLKKJKWIKKKWIKKYYYYWKKKYEREYYYYWKLKKKJLLLJKKLLHHHHHHHBBHHHHzHLLNzHHHHHHHHHJLLJKKJJKJJKYKJIKKKKKKKKKWWKJLJKYKKWIKKJLHHHHLHzHHBHLLBxzHzxNzxBzzzzzzzzzzzzznBBBBBnzzzzzzzzzzzzBBBnzzzzBBBBBBBBBBBBBBBBBBBzzzBBBzzzzzzzzzzzzzzzBBBBBBBBBBBBBBBBzzzzzBBBBBBBBBBBBBBzzzBBBBnznnnzBBBBBnnnzzzzzBBHHBzzBBBzHHHHHHHzHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHBHHHHHHHNNBHBBNHHNNBNzHFNFHHHHHHHHHHHHHHHHHHHHLLLLLLLLLLLLHHHHLLLLLLLLLLJJJJJJJKKKKKKKJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJWKLLFHLLFFHLHFFSKKLFFLWKKLKLHHxlxxzSxccxFzzxxzLK",
+"HzzzzxzFWKKLKWWWKIIIIIYYIIIIIIIIWWYYYKKKHzxlhcxxxxxzLYYWLFh9clhhcchlFLFFzlllSFFSclllxxlcxxxlggghxxFKWKWRKKWYWYYKLKKWKLLKWWKWYYYKEEYWKLLLHFzxSLLzzLKKKYKzHHLKKLLLHLKKKKKKKKKKKKKKLLLLLLLLLKKLHHHHHHHHHHHHBNBHHHBzNBHLJJJKWIIIYYYYEEERRRRR^EYEREYYJEEJHJKIREKKKKKKYKKWKLLJKKLLHHHHKLHHFFFHLWWKLHHHLKWKKKKKFFFHFFFHKFFFxchchxzlcxSxzxzzzzxzFFFFFFFFHHHHFFFFzzzzzzzzzzNBBHHHHLKKKKKKKJJKKKKWWJHLKKKJKLJKIWKLWIIIIYYWKKKJKKYEYKKJKKJLKKKKKKKKKKKKJLLKKKKKLLLLJJJLLLLJLLLLHHHHKJHHBBHHBHHHLHBHHHHHHJLHHLJJJJKIWKKIIWKKKLLLLKJNLLLLLLHNHLHNHHNHFFFFNNNNBBBNBBBBBBBBBBBBBBBBBBBBBBBBNzzzBBBBBBBBBBBBBBBBHBBBBBBBHBBBBHHBHHBBNzzzBBBBBNzzBBBBBBBBBBBBBBBBBBBBBBHHHHBBBBBBHHHHHHHHHHHHHHHHBBHHHHHHLHHHHHHHHHHHHHHHHHHHHHHHBBNBHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHLHHHHHHHLHHHHHHHHHHHHHHHHHHHHLLLLHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHLLHHLHHHHHHHLHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHLLLLLLLLLLLLLLLLLLLLLLLLHLJJJJJJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKLLLKKKLKLLLHHLLHLKKWYWKWKKLKWLLLLLLLzzzHzHHxxzz",
+"LHHJKKKYYEEEYYYKIIKKKKKJJJJJJHHBJLHzzzHKHzBBzHLHzzNHLLFxxcclzWYLKLLWYLSHLFxlllchcllchhgghlxhhclcxHYYHzHKREILNzHHHLKIKJKYKKJKKKLLLLLLLLLLKKLHLKLHHLKHzzFHLSxxzHFSHHHHHHHHLLLJJKKKLLJJLLLLHLLLHHHHzzzzzzzzzzNHLJJJIYETEEETYEEEEEEETTTTTEEEYYKWYYYYKYKJKYYYIKLHJKKKLLKKJKKKYKKKJLLLKLLLLLKKKKWKKKKKKKLLLLLHHFFFFFFLxcxzxlhllFLFzFSxzzFFFHFFzFFFHHHLFFHHHHFFFzzzFHFzzzzzzzBBBHHHHHHHHBBHHHHLJLHLLLLLLLJKKKJJIIIIYYIKLJKKJJKKIKKKKKWWKKKKIKKKJJJJJJKKKKKKKJJLKIKHHJKKKKKKKKKKKKJLHHHLHKJHJJHHJKJLLJLHLLJJLHLJLJJJKKKKKJKKLKWLKKWKKKKKKKLLLJKKJJLLLLLLLHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHBBBBBBBBHHHHBBBBHHHHHHHHHHHHBBHHHHHHHHBBHHHHHHHHHHHHHBBBHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHBHHHHBBHHHHHHHHHHHHHHHHHBBBBBHHHHHHHHHHHHHHHHHHHHHLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJLJJJLLLJLLJJJJJJJJJJJJJLJJJJJJJJLLLJLLLLLLLLLLLLLHHHHHHHHHHHHHHHHHHHHHHHHHHHHLLLLLLLLLLLLJJJKKJJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJKIKKKKKKIYIKKKKLLLLKKKLLHLNNHLFHLJHLHHJLJJLHHHHHHHzzNzzHH",
+"JKKKKKKJKKJLJKKHKKJJKKJJJKPKJHHJJKIIKJKIIIIYIIKHKKLLHHHKHHHHKKKKLKYYWLHKLLLLHFFFzLLLHFFLKKWLKLKHLIYIKKIKIKKJHJKKKHnzBBnBBBHHHHHHLHHHHLHHFHLLHFHLLHHLLHHHFzzzzNHHBzzzzzBHBBBHHBBBBBBBBzzzBzzzHHBzzzzNBBHHJJJKKIYYYEEEYYERYEEETEEEEEEEEEYYEEYYYEEYKIIIIIIYKKKKIIIKKKYYKKKKKKKKKKKKLLKWWKLLKKKLKKLHKLFzFHFxLFzzzzFLFFLLLLzzLFFLLFFLLHLFFHFHFLLFFFFHHHHHHHHHNHHHBBHHHBNzzNBzBBBzzzBBHBHLLHHLLLJKLHHLJJKKKJKIKKKKKKJHBLKIKKKKKKIIIIIYKKIIYYIIKKKJLHJKJJJKKIKKJKKIKKJJKKKKKKKIKKKIIKKKKKKKIKJKKKKKKKKKKKKKKKIIKIIKKKKKLKKKLKYKWWKJKKWWYKKKKWYYYYWWWKKKKKKJLLLLLLLLLLLLHHHHHHHHHHHHLLLLHHHHHHHHHHHHHHHHHHHHHHHHHBBBHHHHHHHHHHLLHHHLLHHHHHHHHHHHHHHHHHHHHHHHHHHHNBHHHHHBzNBHHHHHHHHHHHHHHHHHHLLLHLLLHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHLLLLLLLLJJJJJJJJJJJJJJJJJJJJJJJJJJLLJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJKKKKKKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJKKKJJJJJJKKJJJJLJJJLLLLHHHHHHLJLJJJLLLLLLLLLLHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHLJJJJJJKKKKKKKKKKKKKKIKKKKKKKKIKKKKKKIKKKKKKKKKKKKKKKKKKKKJJJKKKKKKKKKKKIIIIKKKIIKKJJKKJJJLJKJLLLHHHHHHHJJJKLJJKKKJKKKYJKKJJKJ",
+"IKKKKKKKJJKKKKKKJKIIKJKIYIIIIIIIIIIIIIIIIIIIIIIIWWWWWWWWYYYYWKKKWYYYJHLKHzzNLKKKKWKLHHKYYYWWWWKJJJJJJKJJHJJKKKKKKJJHHHHHJJJLHHHBHHHHHHHHHHHHLLLLLHHHHLJJKKKKKKJLHHLLLLLJJJJJJJJJJHHHJJLHJJKIIIKKIIIYYYIIYYYYYYYYEEYYYYYYRYKKYEYIIYEEEYYYYYYYIKWIIIIIIIIIIIIIKKKKKKKYYYKKKKKKKKKKWWKKKKLLLLLLLKKKLLLLLLHHLLLLLLLLLLLLLLLLLLLLLLLLHHHLLLLLLLLLLLLLLLLLLLLLLLLLLLLLHLJJHHHHHHHHHHHHHLLLHHLLLLJJKKKKKKKKIIIIKKKKKIIIYYIIIIIIIKJJJKKKKKIYYIIKKKKKKJJJIIIIIIKKKKKKKKKJKKKKKKKKKKKKKKKJIIIIIIIKKKKKKKKKIIKKKKKKIIIIIYYYYYYYYYEEYYYYYEEEEYKWYEEYYYYYYYYYWWYYYWWKKKKKKKKKKKLLLLJKLLLLLLLLLLLLLLLLLLLLLLLLLLLHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHLLLLLLLLLJJLLLLJJJJLLLLLLLJJJJLHHHLLHHLLLLLLLLHHHHHHHHJLLLLLLLHLLLLLLLHHHHHHHHHHHHHHLLLHHHHHLLJJJJJJJJJJJJJKKKKKKJJKKKKKKKKKKKJJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJKKKKKKKKKKKKKKKKJJJJJJJJJLLLLLLJLLLLLLLLHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHLJJJJJJJKKKKKKKKKKKKIIKKKKKKIIIIKKKKIIIIIIIIIIIIIIIIKKKKKKKKKKKKKKKKKKKKKKKKIIKKKKKKKKKKKKIIJJJJJJJJKKKKKKKKIIIIIIIIIIIIIIII",
+"IIIIIIIIPIIIIIIIIYEYYIYYYYYYYYIIIIIIIIIIIIIIIIIIIIIIIIIIKKIIIIIIKIYYIIIYKJLJKKJJKKKLHLKIJJJKKKIIIPPKKKKKKKKKJJJJJJJJJJJJJJJJJJJJLLJJJJJJKKKKKKKKIIKKKKIIIIYYYYYYYYYYYYYYIIIKJJLHJLHLJJJLHLJKKIIIIIIIYEEEIIIIIIIIIIYYYYYYYIIKIYYYETTTTEEYIYYYYYYEIIIIIKKKIIIIKKKKKKKKKKKKKKKJJKKKJKKKKKKKJLLLLLLLKKKKKKKKKKKKKKLLKKKLLLLLLLLLLLLLLLLLLLLLLLLLLLLLJJJJJLLLJJJJJJJJHLJJLHHLJJJJJKKKKKKKKKKKKKKKKKKKKKKKKIIIIIIIIIIIIIIIIIIIIKKKKIIIIIIIIIKKIIIIIIKKIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIKKKKIIIIYYYYIIIIIIIIIIIIIIIIIYYYYEEEEEEEEEEYYYYYEEYYYEEEYYYYYYYYIIIIIIIWIIIIIIIWKKKKKKKKKKKKKKKKKKKKJJJJLLLLLLLJLLLHHHHHHHHHHHHHHHHHHHHHHLLLJJJJHLLLLLLLLLLLLLLLKKKKKJJJLJJJKKKKKKJKKKKKJJJKKKKKJJJJJJJJJJJLLLLLLLJLLHHLLLLJJJJJHLLLLLLLLLLHHHHHJJJJKKKKJKKKKKKKKJJJJJJKIIKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJKKKKKKKKKKKJJJJJJJLHHHHHHHHBBBBBBBBHHHHHHHHBBBBBBBBBBBBBBHHHHLJJJJJKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKPPPPPPPPPIIIIIIIIIIIIIIIIIIIIIIIIIIIPPPPPKKKKPPPIIIIIKKKKKKKKKIIIIIIIIIIIIIIIIIII",
+"IIIIIIIIIIIIIIIIYYYYYYYYYYYYYYYYYYYYYYYYIIIIIIIIIIIIIIIIIIIIIIIIIIKKIIIKIIIIIIIIIIKKIIIIYYIKJHLJIIIIIIIYIPKJJJJJKKIIIIIPIPPKKKPPIIIIYYYYYYYYYYYYYIIIIIIIIYYYEEEEYYYYYIYYYYIKKKKKKKJKKKKKJHHHHHJJBBBHJKPIPPKKKKKKJKKIIIIKJJJJHJKKJJKJJKKKIIIIIYYYRRRRTTTEIIIIIIYYYIKKKKKIYYYIIIYYKKKIIKKKYYYYIIKKKKKKKKKKKKKKKKKKKKKKKKKWKKKKKKKKYYYYYYIIYYYYYYYYIYYYYIIIIIYYYYYYIIYYIIIIYYYYYYYYIIYYIIIYYYYYYIIIIIKKKIIIYIIIIIIIIIIIIIIIIIIIYYYYYIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIEEEYYYYYEEYYYYEEEEEEEEEEEEEEETTTTTTTTTTTTTTTTTTTEETRTTEYEEEEEEYYYEEEYYYEEEEYYYYYYYYYIIYYYYIIYYYYIIIIIIKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJLLJJJJJJJJJJKKKKKKKKKKKKKKKKKIIKKKKIKKKKKKIIIIIIIIYIIYYYYYKKIIIIIIIIIIIKKKIIIIIKKKKKKKJJKKLJJKKKKKIIIIIIKKIIIKKKKKKKKKKKKKKKKKKKIIYIIIIIIYIIIIIIKKKKKKKKKIIIIIIIIIKKKKIIIIIIKKKKKKPPPPPPPPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIPPPPPPPPIIIIIIIIIIIIIIKKIIIKKIIIKKKKKKKKKKKKKKKKKKKJJJJLHHHLLLLLHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHBBBBBBBBBBBBHHHHJJJJKKKKKKKKKKKKKKKKKKKKIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIPPIIIIIIIIIIIIKKIIIIIYYYIIIIIYYYYYYYYYYY",
+"IIIIIIIIIIIIIIIIYYYYYYYYYYYYYYYYIIIIIIIIIIIIIIIIIIIIIIIIYYYIIIKKIIIIIIPKPIIYEEEEEYYYEEYIYYYIIPIIIIIIIYETEYIIIIYYIIIIIIIIKJJJJJJJKKKPIIIIEEEEETTTTTEEEYEEIIIIIIIIKKKKJJJKIIIIIIIIIKKKIIIKJJJHBBBBzzzzBHJJKKKKKKKKJKKIIKKJJJHBBBHLJJJJJJKKIKKKKKKKKKKKIIKKIIIIIIIIYYYYYIIKIIIIIIIIEEEEEEEEEEEEEEYYEEEEEYYYIIIIIIIIIIIIYYYYIIYYYYYYIIIIIIKKIIIKIIIIYYYEEEEEYYYYYYYYYYEEEYEEEEYYYYYYIYYYIIYYYIIIIIIIIIIIIIIIIIIIIIIIIIIIIIYYYYYEEEEEEYYIIIIIIIIIIIIIIIIIYYYYYIIIYYYYYYEEEEETEEEEEETTTTTTEEEYYYYYYEEEYYEEETTTTTTEEEEEETTRTTEEEEEEEEEEYYEEYIIYEEEYYYYYYYYYYYYYYYYYYYYYYYYYYYIIIIIIIIIIIIIIIYYYYYYIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIKKKKKKKKKKKKKIIIIKKIIIIIIYYIIIKKKKKKKJKKKKKIIIIYYYYYYYYYYIIIIIYIIIIIIIIIIYYIIYYYYYYEEEEEEYYYYYYYYYYYYIIIIKKIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJJKKKKKKPPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIYYYYYIIIIIIIYYYYYYYYY",
+"IIIIIIIIIIIIIIIIYYYYYYYIYYYYYYYYIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIYEEEIIYYIIYEYYYYYYIIIIIIEEEEIIIIIIIIYYYYYEEEEEEYIIIITTEYIIYYIYYEEEEEIIIIIIIYEEEEEEEEYYYIIIIIYEEEEEETIIIIIIIIIIIIIIIIPPPKKKKJJJJKPIIIIIIIIIIIIIIIIIIIIIKJJJJJKKKJJJJJJJHHHHHBHHJJKKKKJJJHBBzzBHHHHBzzzzzzzzzzBBHHHLJJIIIIIIIIIIIIIIIIKKKKKKKIIKKKJJJJJJJKKKKKIIIIIKKKKKJJJJJJHLJJJJJJIIKKKKKKKKIIIIIIIIIIIIKKIIIIIIIIKKKKKKKKIIIIIIIIIIIIIIIYIIIIIIIIIIIIYYEEEEEEEYYYYYYYYYYYEEEEEEEEEEETTTTEYYEEETTTYYEEEEEETTTTTEEEEYYIIPKKKKIIETTTTTTTTTTTTTTTTTTTTTTTTTTETTTTEEEEEEEEEEEETTEEEEETTTTTTTRRTTTTTEEYEEYYYYYYEEEETTTTEEYYYYYYYYYYYYYEEEEEEEEEYEEEEEEEEEEYYIIIIIIIIIIIYYYYYYYYYYYYETTTEEEYYIIIIIIIIIKKKKIIYYEEEEEEEEETEETTTEEEYIIIIYEEEEYYYYYYIIIIIIIIIIIIIIIIYYYIIIIIIIIIIIIIIIKKKKIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIYYYYYYYYYYYYYIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIYIIIIIIIYIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIYYYYYYYYIIIIIYYYIIIIIIIIIIIIIIIIIIIIIYYYIIIYYEEEYYYYYYYYIIIIIIIIYYYYYYYY",
+"IIIIIIIIIIIIIIIIIIIIYYIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIYYIYETYEEIIIIIIYEIIIIYTYIIYIIPIIYYYYIIIIIIIIIIEEYYYYEEEYIIIIIIIIIIIIIIIIIIIYYYIIIIIIIIEEEEYYYYIIIIIIIIYEEEEYIIYYYYYYEEEEEEEEYYTTTTTTTETTEEEEEEEEEEEEEEEYIIIIIITTTTTEYYTTETTTTTETTTTTTTTTTTEEYYYIIIIIIIIIIIIIYYIIIIIIIIIIIYYYYERRR!!!!!^^!!!!!!!!RRTTTTTTTTRR!!RRRTTTTTTEEEYYYYTTTTTTTEEEEYYYYYYYYYEEEEEEYYYYYYYEEEYYYEYYYYYYYEEETTTTEYEEEEETTTTTTTEEEETTTEEETTETTTTTTTTTTTTTTTTTTTTTTTTTTRRRTTTTTTTTTTTTTTTTTTRR!!!!!!TTTEYIIIYETTTRRRRRRRRRRTTTTTTTTTTTTTTTTETTTTTTTETTTTTTTTTTTTTTTTTTTTRRRRRRRRRTTTTTTTTTTTTTTTTTTEEEEEETTTEEEEETTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTEEETTTTTTTTTTTTTTTTEEEEIIIIIYYIYYIIIIYETTTTTTTTYIIIIIIIIIIIKKKKIIIIIIIYIIIIIIIIYYYYYYYYIIIIIIIIYYYYYYYYIIIIYYYYYYYIIIIIYYYYYYYYYYYYYYYYYYYYYYYYIIIIIIIIIIIIIIIIYYYYYYYYYYYYYYYYEEEEEEEEYYYYYYYYYYYYYYYYYYYYYYYYYYIIIIIIIIIIIIIIYYYYYYYYIIYYYYYYYYYYYYEEYYYYYYYYEEEYYYYYYYYYYYYYYYYYYYYYEEEEEEEEIIIIYYYYIIIIIIIIYYYYYYYYIIIIIIIIYYYYYYYYEEEEEEEEIYYYEEEEYYYYYYYYIIIIIIIIIIYYYYYYIYYYYYYYEEEEEYYYEEYYYYYYYYYYYYYY",
+"YYYYYYYYYYYYYYEEIIIIIIIIIIIIIIIIEEEEEEEEEEEEEEEEEEEEEEEETTEEYIIIYYEYIIIIYTTEETTETTTTTETTIIIIETTTEEEEETTTTTTTTTTTEEEEEETTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTEEEEETTTTTTTTTTTEEETTTTTTTTTTTTTTTTTTTTETTTTTTTETTTTTTTTEEEEEETTYYYYEEEYIIIYYYEEIYEEEETTTTTTTTTTETTTTTTTRRTTTTTRTTTTTTTTRTTTTEEETTTTTTTTTTTTTTTTTTTTTTTTETTTTTTTTTTTTTTTRRRTTTTTTTTTTTTTRRTTTTTTRRRRRRRR!RRR!!!!RTTTTTRRTTRRTTTRTTTTRRRRTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTRRRTTTTTTTTTTTTRRTTRRRRRRTTTTTTRRRRTTTTTTTTTTTTTTTTTTTTTEYYEEEEEEEETTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTEETTTEEEYYEEEETTTTTTTTTTTTEEEEEEEEEETTTTTTTTTTTTTTEEEEEEEYYYYIIYYYEEYYEEYIIIIIIIYYYYEYYYYYTTEEEYIIIIIIIIIIIIIIIIIIEIIIIIIIEYIIIIIIYYYYYYYEYYYYYYEEYYYEEEEEEEEEEEEEYYYYYYYYEEEEEEEEEEEEYYYYEEEEEEEEYYYYYYYYYYEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEYYEEEYYEEEEEEEEEEEYYYYYYEEEEEEETTTEEEEEEETEEEEEEEEEEEEEEEEEEEEEEEEYYYYYYYYEEEEEEEEEEEEEEETEEEEEEEEEEEYYYYYYYYYYYYYYYYYYYYYIIIYYYEEEEEEEEEEEEYYYYYYEYYYYYYYEEEEEYYYEEEEEEEETTTEEEEEEEEEEEEE",
+"YYYEEETTEEEEEEEEIIEEIIIYTTTEEEYYTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTETTTTTTTTTTTTTTTTRTTTETTTEETTTTTTTTTTTTTTEETTTTTTETTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTETTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTEEETEEEEETTTTTTTTTTTTTTTTTTTTETTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTEEETTTYYYYYYYYTTTTEEYYEETTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTEEETTTTTTTEETTTTTTTTTTTTETTTEEETTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTETTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTEEETTTTTTTTTTTTTTTTTTTYEETTTTEYEEEETTTTTTTTTTTTTTTTTTTTTTTTTTTTTTEYYYYYYEEEYYIYYEEEEEYEEEEEEEEEEEEEEEEEEEEEEEEEEYYIIIYYIIIIIIIIIYEEEYYYEEEEEEEEEEYIIIIYEEEEEYYYYYYYYYYYIIIYYIIIIIIYYYYYYEEEEEEEEETTTTTTTTTTTYYTTTTTTTTEYIETTEIIIIEEEYYIYYYYYIIYYYYYYYYEEEEEEEETTTTEEEETTTEETTTTTEEEEEETTEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEYYYYYYYYEEEEEEYYEEEEEEEEEEEEEEEEYYYEEEEETTTTEEEEEEEETTTTTTTTTTTTTTTTTTTTYYYYEEEEYYYYYYEEYYYEEEEEYYYYEETTEEEEEETTTTTEEEEETTTTTTTTEEEEEEEEYYEEETTTEEEEEEEETTTTEEEEEEEEEEEETTTTTTTTEEETTTTTTTTTTTTTTTTTTTTT"
 };
diff --git a/hacks/images/earth_night.xpm b/hacks/images/earth_night.xpm
new file mode 100644 (file)
index 0000000..a2bfbe2
--- /dev/null
@@ -0,0 +1,610 @@
+/* XPM */
+static char *earth_night_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"1024 512 92 1 ",
+"  c #010004",
+". c #01000D",
+"X c #090A0B",
+"o c #010013",
+"O c #01001D",
+"+ c #0A0B1C",
+"@ c #080918",
+"# c #15161B",
+"$ c #0F1119",
+"% c #030222",
+"& c #080726",
+"* c #060826",
+"= c #0B0B24",
+"- c #050529",
+"; c #08072A",
+": c #06092A",
+"> c #0C0B2C",
+", c #100F2E",
+"< c #110E24",
+"1 c #0E102B",
+"2 c #121324",
+"3 c #13132C",
+"4 c #1B1B2C",
+"5 c #191927",
+"6 c #0D0D32",
+"7 c #0B0C36",
+"8 c #100F33",
+"9 c #110E3A",
+"0 c #0F113A",
+"q c #0E1132",
+"w c #131334",
+"e c #1B1B34",
+"r c #14153D",
+"t c #18173C",
+"y c #1B1A3C",
+"u c #171737",
+"i c #201E3B",
+"p c #201F2C",
+"a c #1E2131",
+"s c #25262A",
+"d c #23233B",
+"f c #272837",
+"g c #35363A",
+"h c #303235",
+"j c #21231B",
+"k c #43453C",
+"l c #151640",
+"z c #161942",
+"x c #1B1C45",
+"c c #1D1E49",
+"v c #191743",
+"b c #15144A",
+"n c #201F45",
+"m c #201F4A",
+"M c #211E51",
+"N c #1E2048",
+"B c #1E2051",
+"V c #232343",
+"C c #2B2B43",
+"Z c #23224A",
+"A c #2B2A4A",
+"S c #363748",
+"D c #393955",
+"F c #2F2E49",
+"G c #3E3B62",
+"H c #413E55",
+"J c #3E414D",
+"K c #464749",
+"L c #474757",
+"P c #565759",
+"I c #515251",
+"U c #4A4A64",
+"Y c #575767",
+"T c #585771",
+"R c #666768",
+"E c #676877",
+"W c #757675",
+"Q c #616263",
+"! c #3E4139",
+"~ c #84857B",
+"^ c #757587",
+"/ c #615F82",
+"( c #7E818B",
+") c #8B8C91",
+"_ c #9595A7",
+"` c #ACADB0",
+"' c #A2A49E",
+"] c #B6B6C7",
+"[ c #CDCED0",
+"{ c #E9EAED",
+"} c #C2C4BD",
+"| c #7F807F",
+/* pixels */
+"rrrrrr00rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrzzzzzzzzzzzzzzzzxxxxxxxzcccccccxccccxxxxxxxxzzzzlllrrrrrrrrrlllzlzzzzxxxrrrllzzzzzzxxxxxNNNNccccccccccccZNcxxxxxxxxxcccccxxxxvvvxxxxvvvvrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrtvvvzrrrrllllllllllllllllrrrrrrrrrrrrrrrrrrrrrrrrlllrrrrrrrrllzzzrrrllzzzllllllllrrrrrrrrrrrrrrrrtttttzzzzttttttzttttttttrrrrrrrrrrrllrrrrrrrrrrrrrrrrrrrrrrrrrrrllllllllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrttttttttrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrzzzzzzzzrrrrrrrrrrrrrrrrrrrrrrrrzzzzzzzzrrrrrrrrrrrrrrrrlllzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzlllzzzzzzzzrrrrrrrrrrrrrrrrllllllllzzzzzzzzllllllllrrrrrrrrzzzzzzzzzzzllrrrlzzzzzzlzzzzzzzzllllllllzzzzzzzzlllzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzllrrllzzzzzzzzzlllllllllllllllllllzzzzzzzzzzzzzzzzllrrrrrrrrr00rrrrrrrr0000000000000000000000000000000077777777777777777777777777777777007777770000000077777777000007777777777777777777000000007777777777000000000000000000000r000000007777777700000rrr",
+"00000007000000rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrxxxxxxzzzzzzzzzzzzzzzzzzzllrrrrrrrrlzzzzrrrrrrrr000rrrrlzzzzzxxxxxxxcccccccxxxxxxxxxxxxxxxxzzzxxxxxxxzzzxxvvvzzzrrrrrrrrrrrtttttrrrrrrrrrrrrrrrrrrrrrrttrrrrllzzzzzzzzzzllllllllrrrrrrrrrrrrrrrrrrrrrrrrlllrrrrrrrrllzzzrrrllzzzllllllllrrrrrrrrrrrrrrrrttttttzzzttttttzttttttttrrrrrrrrrrrllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrttttttttrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlllzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzlllzzzzzzzzrrrrrrrrrrrrrrrrllllllllzzzzzzzzllllllllrrrrrrrrzzzzzzzzzzzllrrrlzzzzzzlzzzzzzzzllllllllzzzzzzzzlllzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzllrrllzzzzzzzzzlllllllllllllllllllzzzzzllllllllzzlllrrrrrr00000000000007777777777777777777777777777777700000000777777777777777777777777077777777777777777777777777777770000000000000000000000000000000070000000000000000000000r000000000000000007777000",
+"70000000r0000rrrrrrrrrrrrrrrrrr0rrrrrrrrllrrrrrrrrrrllzzzzxxxxxxzzzzzzllzzzzzzzlzlrrrrrrrrrrrrrr00000000000rrlzzzllllrrrzzzzzzzzzzzzzzxxzzzzzzzzzllllzzzzzzzllrrzzzlllllrrrrrlllrrrrrrrrrrrrrrrrrrrrrrrrttttrrrrrrrrrlzzllllllllllllllllrrrrrrrrrrrrrrrrrrrrrrrrllrrrrrrrrrllzzzrrllllzzllllllllrrrrrrrrrrrrrrrrtttttttzttttttttttttttttrrrrrrrrrrrllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrttttttttrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrllllzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzllllllllllllrrrrrrrrrrrrrrrrllllllllzzzzzzzzllllllllrrrrrrrrzzzzzzzzzzzllrrrllzzzzllzzzzzzzzllllllllzzzzzzzzllllzzzzzzzzzzzzzzzzzzzzzzzzzzzzzllrrllzzzzzzzzzllllllllllllllllllllzzzzrrrrrrrrlllrrrrrrrr000007777777777777777000000000000000000000000rrrrrrrrrrrrrrrrrrrrrrrr000000000007777077777777777777777700rrrr000rrrrr00000000000000000000000000000077000000000000000r00000000rrrrrr0000000rrr",
+"00rrrrrrlrrrrlzzrrrrrrrrzzzzzzzlzzzzzzzzxxzzzlrrrrrlzzzzzzxxxxxxxxxxxzzzxxxzzzzzxzzzlrrrrrr007770000000rrrrlzzzzrrrrrrrrrrrrrrrrrrrrlzzzrrrrrrrrrrrrrrrrrrrrrrrrllllllzzzzzzzlllrrrrrrrrrrrrrrrrrrrrrrrrtttrrrrrllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrllzzzllllllllrrrrrrrrrrrrrrrrrrrrrrrrrrtttttttttrrtttrrrrrrrrrrrrrrrrrrrllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlllzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzlllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrllllllllrrrrrrrrrrrrrrrrllllllllzzzllrrrrlzzzzlrllllllllrrrrrrrrllllllllrrlllzzzzzzzzzzzzzzzzzzzzzzzzzzzzllrrllzllllllllrrrrrrrrrrrrrrrrrrlllzzzzzzzzzzzrrrrrrrrrrrrrrrr000000007777777700000000rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr0000000000777777000rrrrr00000rrrrrrrrrrrrrrrrrrr0000000000000077000000000000000rrrrrrrrrrrrrr000rr000rrr",
+"rrrlzzzzzzzzzzxxzzzzzzzzzzzzxxxxxxxxxxxxzzlrrrrrrrrrrrllrlzzzzzzzzzzzzzzzzzzzzzzzzzlrrrrrr007777000rrrrlrrrrrrrrlllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr00rrrrrlzzzzzzvvvvvzlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrttrrrrrrzllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrllzzzllllllllrrrrrrrrrrrrrrrrrrrrrrrrrrrtttttttrrrrttrrrrrrrrrrrrrrrrrrrllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrllllllllrrrrrrrrrrrrrrrrrrrrrrrrllllllllrrrrrrrrrrrrrrrrrrrlllzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzlllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrllllllllrrrrrrrrrrrrrrrrllllllllzzzllrrrrrlzzlrrllllllllrrrrrrrrllllllllrrrlllzzzzzzzzzzzzzzzzzzzzzzzzzzzllrrllzllllllllrrrrrrrrrrrrrrrrrrrlllzzzzzzzzzzrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr77777777777777770000000000000000777777770000000000000000rrrrrrrrrrrrrrrr00000000700007777770000000000000rrrrrrrr0000000000r00007000000000000000rrrrrrrrr0000000077777700",
+"rrrrlzzzzzzzzzzxllllllllrrlzzxxxzzzzzzzzlllrrrrrrrrrlzzzrrrrrrrrrrrrrrrr0rrrrrrrrrrrrrrrrrrrrrrrrrrrlzzzzzlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr0070rrrrzzzvvvvvvvvxxvvvzllzttrrrrrrrrrrrrrrrrrrrrrttttrrrrrllllzzzrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrllrrrllzzzzzllllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrttttttrrrrttrrrrrrrrrrrrrrrrrrrllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrllllzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzllllllllllllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrzzzllrrrrrllllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrllllzzzzzzzzzzzzzzzzzzzzzzzzzllrrllzrrrrrrrrrrrrrrrrrrrrrrrrrrrrllllrrrrrrrrrrrrrrrr00000000rrrrrrrrrrrrrrrr00000000000000007777777700000000777777770000000000000000000rrr00rrrrrrrrrrrrr000rrrr00777777700000000000rrrrrrrr00000000rrrrrr00000000000000000rrrrrrrrr0000000000070000",
+"rrrrllllzzllzzzzllllllllrrlzzzxxzzzzzzzzzzzzzzzzzzzzxxxxrrrrrrrrrrrrrr00rrrrrrrrrrrrrrrrrrlzzzxxzzzzzzzzxxxxzzzzrrrrrrrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrr000rrrrrrlxxxvvvzzvvxxxxxxzzztrrrrrrrrrrrrrrrrrrrrttzzzzvvvvvvzzllllllllllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlllrrrllzzzzzzllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrttttrrrrrrtrrrrrrrrrrrrrrrrrrrllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlllzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzlllllllllllrrrrrllllllllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrzzzllrrrrrrllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlllzzzzzzzzzzzzzzzzzzzzzzzzzllrrllzrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlllrrrrrrrrrrrrrrrr00000000rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr0000000000000000rrrrrrrrrrrrrrrrrrrrrrrr7700000000000000rrrrr000rrlllrrr000000000000000000000000rrrrrrrrrrrrrrrr000000000000000r00000000rrrrrr00rrrrrrrr",
+"rrlzzzzlzzzzzzzxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzlzzzzzlrrlllrrrrrzzzzzzxxxxxxxcccxxxxzzzzxxxxzzzzxxxxxxxxzzxxxxxxxxxxxxzzlrrrrrrrrrrrrrrr0rrrrrrrrrrrrrrrxxxvvzlrrrrlvxxxztrrrrrrrrrrrrrrrrrrrrrrvvvxxxxxccxvzrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlllrrrllzzzzzzllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrttttrrrrrrtrrrrrrrrrrrrrrrrrrrllrrrrrrrrrrrrrrrrrrrrrrrrrrrllllllllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrllllllllrrrrrrrrrrrrrrrrrrrrrrrrllllllllrrrrrrrrrrrrrrrrrrrrrlllzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzlllllllllllrrrrrllllllllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrzzzllrrrrrrllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlllzzzzzzzzzzzzzzzzzzzzzzzzzllrrllzrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlllllllllllrrrrrrrrrrrrrrrrrrrrrrrr0000000000000000000000000000000000000000000000000000000000000000700rrr0000000000rrr00000rrrrrrrrrrrrrrrr0000000000000000rrrrrrrrrrrrrrrr000000000000000r00000000rrrrrrrrrrrrrrrr",
+"rrrrrrrrzzlrrlzzzzzzzzzzzzzzzzzzzlrrrrrrllzzzzzzzzzzzzlrzzzzzzzzcxxxzzzzrrrlllllzzzxxcccccxzzzzzNccxxzzzxxxxxxzzzzzzzzzzzzzzzzzzcxxzzzzzzzzlrrrrzzxxxzlrrrrrr000rrrrrrrrrrrrrzvxzzzzzzzzrrrrrrrrrrrrrrrrxxxxxxcnxxxxxxxxlrrrrrlzlllrrrrrzzzlllllrrrllzzzllrrrrrrrrrlzzzxlllzzzzzzzzzzzzzrrrrrrrrrrrrlllrrrrrrrrrrrrrrrrrrrrrrrrrrttttttrttttttttrrlvvzlrrrrrrlllrrrrrrrrllllllllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrllllllllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrllllllllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlrrrrrrlrrrrrrrrrrrrrrrrllllllllrllzzzzzrrrrrrrrrrrrrrrrrrrrrrrrrrrllzzzzzzzzzzzzzzzzlllzzzzzlllrrrllzzzzzzlrrrrrrrrrrrrllrrrrrrrrrrrrrrrrlllzzzrrrrr000rrrrr000rrr00000777000000000000000000rrr0000rrrrzlrrr000rrrrrrrr0rrr0000000rrrrrrrrrr000rrrrrrrrrrrrrrrr00000rrr000000000rrrrrr0rr00000000000000rrrrrrrrrrrrrrrr00rrrrrrrrrrrrrrrrrrrrrrrrrrrr00",
+"rrrrrrllzzzzzzzzrrrrrrrrlrrrrrrrlrrr000077777777lllzzzzzxxxxxxxcxxzzzzzzxzzzzzzzzzxxxccNccxxxxxxNNNcxxxxxxxxxxxxxxxzzlllrrrrrrrrrrrrrrlzzzllllllzzxxxxzzlrrrrrrrrrrrrrrrrrrrrlzvzzzzzzzzrrrrrrrrttttttttxxxxxxcnxxxxxccclrrrrrrlrrrrrrrrrrrrrrrrrrrrrrrrzzlllrrrrrrrllllrrrrllllzzzzzzzzrrrrrrrrrrrrlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrllrrrrrrrrlllrrrrrrrrrrrrrrrrrrrrrrrrllllllllllllllllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrllllllllllllllllrrttttttrrrrrtttrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlrrrrrrlrrrrrrrrrrrrrrrrllllllllllzzzzzzrrrrrrrrrrrrrrrrrrrrrrrrrrrllzzzzzzzzzzzzzzzzlllzzzzzllllllzzzzzrrrrrrrrlllrrrrrrrrrrrrrllllllllllrrrrr000000777000000000007777777777770000000007777000rrrrrrrrrrrrrrrrrrrrrrrrrrrrrr0000000rrrrrrrr0000rrrrrrrr000000000000rrrrrrrrrrrrrr0000rrrrrrrrrr000000000000000000000000rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr",
+"rrrrrrrrrrlzzlrr000rrrrrrrrrrrrrrrrrrrrrzzzllrrrrrllzzxxxxccccccxxxxxxzzccccxxxxzzzxxxccxxccNNccccccxxxxzxxcccccNcxzzrrrrrrrrrrrrrrrrrrrrrrrrrllrrlzzzzzllllllllrrrrrrrrrrrrrrrlttttttttrrrrrrrtvvvvvvvvxxxxxxcnvvxxxccmvvzlrrllrrrrrrrrrrrrlzzzrrrrrrrrlllrrrrrlrrrrrrrrrrrrlllzzzzzzzzzzzzzzzzllzzzlrrrrrrrrrrrrrrrrrrrrrrrrrrrrttttrrrrrrrrttlrrrrrrrrrrrrrllrrrrrrrrrrrrrrrrrrrrrrrrllllllllllllllllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrllllllllrrrrrrrrrrrrttttrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlrrrrrrlrrrrrrrrrrrrrrrrllllllllzzzzllllrrrrrrrrrrrrrrrrrrrrrrrrrrrllzzzzzzzzzzzzzzzllllzzzzllllllllzzzzrrrrrrrrzllrrrrrrrrrrrrrrrrrrrrrrrrr000000000077000000000007777700000000000000000077770000000777rrrrrrrrrrrrrrrrrrrrrr00rrrrr0000000000r0000000000000000000rrrrrrrrrrrrrr000000rrrrrrrrrrrrrrrrr7777777700000000rrrrrrrrrrrrrrrrrrrrrrrrrrr0rrrr",
+"7777777777000077000rrrrrrrrrrrrrrrrrlzzxxzzzlrrrzzzzzzxxxxxxxxxxccccccccNNccxxxxlzzzzxxxxccNNNcxzzzzzzxxxxxccNccccxzzlrrzzzzzzzzlzzzlrr0rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrzzxxxxxxxxxxxxxxxxcvvvxxxxccxxxvvvvzzllrrrrzzzzxxxxlllzzzzzrrrrrrrrlllllrrrzzzzzzzzxxxxxxxxccccccccvxxxvvzlzzzzzzzzrrrrrrrrttttttttzvxxxxvzttzvvxxxvzlrrrlzrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrttttttttttttttttrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzllrrrllllllllllllllllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlrrrrrrlrrrrrrrrrrrrrrrrllllllllzzzzlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrllzzzzzzzzzzzzzzlllrrzzzlllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr0rrrrrrrr00rrrrrrrrrrrrrrrrrrrrrrrrrr000000000777777777770007777777777;;;77770rrr00000000rrrrrrrrrrrrrrrr0000000000000000rrrrrrrr00000000rrrrrrrrr007700r00000000rrrrrrrr77777777000000000000rrrr00000000rrrrrrrrrr007000",
+";;;;;;;;777777777700rrrrrrrrrrrrrrrrlzzzzzzzzxxxxxzzzzzxxxxxxxxxcccccccccxxxzzzzzzxxxxxccccNcxxzzzzzzzzzxccccccxxxzzzzzzxxxxxxxxxcccxxzlzllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrzzzzzxxxxxxxxxxxxxxxxxxcvvvvvvvvcxxxxvvzzzzllrrrrrrlzzzzxxxxxxxxzzzzzzllllzzzzxxxxxxxcccxxxxxxxxccccccccxcccxxxvxxxxxxxxttttttttxxxxxxxxxxxxxxxxxxxxxxxxxxvzlzvvrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrttrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrllllllllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzllrrrllllllllllllllllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlrrrrrrlrrrrrrrrrrrrrrrrllllllllzzzlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrllzzzzzzzzzzzzzlllrrrzzlllrrrllrrrrrrrrrrrrr000000rrrrrrrrr00rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr77777777777777777777777777777;;;;777770000000000rrrrrrrrlrrrrrrrrr00007777777777000000000000000000000000r007700r00077000rrrrrrrr00000000000000000000000000000000000rrrrrrr077777",
+"7777777707777770777000rrrr000rrlrrrrrrrrrrlzxcNNxxxxxxzzxxccccccxxxxxxxxxxxzzzzzcccNNNNNccccxxzzxxxxxxxxxxccccxxzzzzzxxccccccccccccNNNNNccxxxzzzxzzzllllrrrrrrrrrrrrrrrrrrrrlrrrrrrtzzzzxxxxxxxcxxxxxxxxxxxxxxxxxxxxvvvvxxxxxvzlzzzllrrrrllzzzzzNNNNcccccccxxxxxzzzxxxccccccccNNccccccccxxxxxxxxccccccxxccccccccxxxxxxxxxxxxxxxxvxxxxxxvxxxxxxxxxxxvvvvvllrrrrrrrrrrrrrrrrrrrrrrllllllllllllllllllllllllrrrrrrrr9999999999999999rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrttttrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlzzzzzzzzzllllllllzzzzzzzzzzzzzzzzzzzzzzzzzzzllrrrzzzzzzzzzzzzzzzzrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlrrrrrrlrrrrrrrrrrrrrrrrllllllllllllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrllzzzzzzzzzzzllllrrrrllllrrrrzzzzllllrrrrr00000000rrrlrrrrrrrrrrrrrrrllrrrrr00000rrrr0000rrrrr00000000077777777777777777;;;;;777;;---;;;;77770000000000rrrrrrrrrrrrrrrrr0007700000000777777770000000700000000r000000rrr000rrr00000000rrrrrrrr0000000000000000rrrrrrrr0000rrrrrrr07777",
+"rrr00000r000000r00000rrrrr00rrzxzzlrrrrr770000rrzzxccxxzccccNNNNxxxxxzzzxxxxxxxxNNNNNNNNccxxxxxxxxxzzzzzzxxxcccczzzzxxxcxxxxxxxxccccccNNNNNNNcccccxxxxccxzzzzzllrrrrrrrrrrrlzzllttzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcxxxvxxxxxxzzxxxcccccNNNcccccccccccxxxxxxxxccxxxxxxccxxxxxxxxxxxxxxxxxxxccccxccccccccccccccccxxxxxxxxxxxxxxxxxxxxvzztxxxxvvzllllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr0000000066666666666666660000000000000000rrrrrrrr00000000rrrrrrrtrrrrrrrr0000000000000000rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlzzzzzzzzzllllllllzzzzzzzzzzzzzzzzzzzzzzzzzzzllrrrzzzzzzzzzzzzzzzzrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlrrrrrrlrrrrrrrrrrrrrrrrllllllllrrrrrrllrrrrrrrrrrrrrrrrrrrrrrrrrrrllzzzzzzzzzzzlllrrrrrlllrrrrrrrrrrrrrrrrrr000r0000777007770rrrrrrrrrrrrrr000070000000000rrrrr00007777000000007777777777777777;;;;----;;;;;77700000000000rrrrrrrrrrrrrrrrr0000rrrrrrrr00000000rrr0000000000000rr0000rrrrrrrrrrrrrrrrrrrrrrrrrr0000000000rrrrrrrrrrrrrr0000rrrrrrrrrrr0",
+"rrrrrrrr0rrrrrr0rrrrrrrrrrrrrzxNcxxxxxxxccxzrrr0rzxNNcxxcccccNNNNcccxxxzxxxxxxxcxccccccccxxxxxcczzzzzllllzzxcccczzzzxxxxxxxxxxxxNcxxzzzxNNNNNNNNcccccNZZNNNccxxxllllllllrrrzvvvzrrtzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccmZZccZZZZmcZNNNNNNNNNNccccccccxxxxxxxxxxxxxxxxxxxxxzzzzzxxxxxxxxxxxccccccccvvxxxxxxccccccccxxxxxxxxxxxxxxxxxcnnnncxxxxxvzztvvxxvzrrlllrrrrrrrrrrrrr00000000000000000000000000000000777777776666666666666666777777777777777777777777777777776666wrrr99776666777777777777777700000000rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlzzzzzzzzzllllllllzzzzzzzzzzzzzzzzzzzzzzzzzzzllrrrzzzzzzzzzzzzzzzzrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlrrrrrrlrrrrrrrrrrrrrrrrllllllllrrrrrllzrrrrrrrrrrrrrrrrrrrrrrrrrrrllzzzzzzzzzzzlllrrrrrlllrrrrrrr000000000rrrrr00077;;-;----770000000007770000000000000rrrrrrrr0000077777777777777777777777777777777777777;;;77000000000000rrr0000rrrrr00rrrrrrrrrrrrrrrrrrrrrrrrrrrrrr000000000rrrrrr0rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr00rrrrrr0rrllllr",
+"rrrrrrrrrrrrrrrrrrrrrrr0rrrrrrrrxccccccNNNccxxxccccxxxxxcxxxcNNNccxxxzzzzzzzzxccccNNNNNNccccccccxxzzzzzzxxcNNNNcttttzvvxxxxxxxxxxxxxxcccZZZZmmccZZncxcnncxxxvxxxxxxxxxxxnnnnnnnnxxcncxxxcccxxxxxnnnnnnnnxxnnnnnnmmmccxxxccccccccccccccccNNNNNNNNZZZZZZZZccccccccNNNNNZZZcccccNNZcccccxxxxxxcccNNZnnxxxvvnxxxxnxxxnnZnxxvxnZnxxxxxxxnxvtxxxvtvxnZxnZnxzzvczrrtvtrwrrw769w6666666;;6666677077666666;;66;>6666wwww666>6666;>;;;>666w666666;6666666666>;;;;;;;--****>>6>;;>666799977>>>>>>67000000007777777777777000wwwrrrrrrrrrrrrrrrrrllllllllllllllllllllllllllllrrrrrrrrrrrrrrrrzllllllzllllllllllllllllllllllvvllzzzzlllllzzvvvlllzzzvvlllzzvvvzzllllllvvvvvvvvrrrrlzzzrrrrrrrrllllllllllllllllllllllllllllllllllllllllxllllvvlrrzzzzrrrrrrrrrrlllllzzzllllllllzllllllzlllllzzzcxvvvlllvvllllll00000000rrrrrrrr00000rrr077:----:::-------7770rr000rr000rrrrrrrrrrrrrrrrrrrrrr00777777777777777777777000;77777;-77777777000000000000rrrrrrrrrrrr000rrrrrxzzzllllzllrrllzzzzzzzrrrrrrrrrrrrrrrrrrrrrrrlllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrllzzllrrrrrr",
+"rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrzzxxxxxxxxxxcNNZccxxxxxxxxzxccNcNNNccxxxxxxxxxcNNNNNNNZZNNNNNNNNccccccccNNNNNcxxxxxxxvvzxxxxxxxxcccccmmmxxxxxxxxxvvvvxcnxxvxxxnnxxxxxxxcxxxxxxxxxxcccxxxZnnnccxxxxxxxxxxxnnnnnxxxxxxxxxxxxxxxxxxccccccccNNNNNNNNNNNNNNNNccccccccNNNNNZZZZZNNNNNNNNNNNNNNNNNNNcccxxxxxxxnxxnZZnxxxxxxxnnntxxxxxxxZnnZnvtttttvxnnZxxnnxxxnnxtrrrr9rrwwwwrr7666666677766;66666777006>;6;--;;;;;;;;;-------%%%%%%%----%-;;;;%%%%%%%%%%%%-;;;%%%%%%%%%%&&%%-;;;;;;666::::>>66;;::;;;7666666666666770000000rrr0000rrrrrrrrrrrrrrrrrlllrrrrrrrrrrrrrrrr00000000rrrrrrrrrrr00rrr00000000000000000000rlllzzzzzzzzrrrrrrrrlllzzvvvllllllzzlllllllllllllllltrrrrrrrttttttttlllllllllllllllllllllllllllllllllllllllllrrrlzzlrrrrrrrrrrrrrrrrlllzzzzzrrrrrrrrrrrrrrrrrrrrrrrlvvllllllllllllllrrrrrrrrrrrrrrrrrrrrrrrrr07777777777777777770000rrllrrrrllrrrrzzxxzzrr00rrrrr000777;777777777777777777777777777777777777;;;7777777770000rrrrrrrrrrrrllzzzzzllllzllrrrrllzzzzzzrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrllllrrrrrr",
+"rrrrrrrr000000000rrrrrr0rrrrrrrrrrlllzzzzzzxcNZZccxxxxxxxxzxxcccNNNNcccccccccccNNNNNNZZZNNNNNNNNNNNNNZZZNNZNNccxnnccxxxxxxxcccccmmmmccccxxccccccxxxxxcnnZZncxxxxxxxxxxcnxxxxxxxxxxxcccxxnnccccxxxxxxxxxxnnnnnxxxvvxxxxccvvvvvvvvccccccccNNNNNNNNccccccccccccccccNNNNNNNNNNNNNNNNNNcccNNZNNNNNNNNnnnZZZZZnZZZZZZZZZZnxxxxxnZnnxnnxvxnZnnZxxnnnxxxtvxxvvxxxxvtrrrwr76679766666;;66;;;;;666;;66;:---;;----%--%%%%--%%------666666666>>66666ww6666;;6;;;;-%%%%%%%%%%OOOOOO%%&%%%%--;::>>>666666;:---;;:--:;;;;;6666600000000rrrrrrrrrrrrrrrrrrrlllllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr0000rr00000000r00000007700rrlllrrrrrrlrrrrrrrrrrrrrrrrrrrlllzzzzzzllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrllllllllrrrrrllzrrrrrllrrrrrrrrrrrrrrrrrrrrrrrrlzlrrrrlzlrrrrrrllllzzzzzvvvlllllvlllllllrrrrrrrrttrrrrrrllllrrrrr007777000rrrllzlllllllllllzzllrrr000rrrzzrr07770077777777777777777777777777777777;--;777777777700000rrr77700000rrrrrrrrlllllllllrrrrllzrrrrrrrrzzzzzzlrllllllllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr00rrrrrrrrrrrrrrrrrrrrrrrrllrrrrrr",
+"rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrzzxcZZcccccccccxxxcNNccccccxxxNNccccccccccNNNNcccccNNNcccNNNNNcccNNZZZxxxccnZZnnZZZZZZccccxxxxccmmZZZZZnncxxxxZZnnncccxxxxxxcnxxxcccnncccnnnnnxxxxxxxxxxxxxxnnnnnnnxxxxxxxxcccccccccccccccccccnnnnnnnnnnnnnnnnnnccccxxnnnnnnnnxxcZZZZZncxxxxxxxxxxccccnnnnxxxxnxtrtxZZZnnxxxxxZZnxtvxnxtvxnxxnZZZnnxxxccxxxxxxxxxxxvvvzr67rr766666;;;6;;::;;6;6666:-%%-66;;ww66>;;;;--%-6666wrxxxzzzxxzttzzzttxztttrrrxxttr6;-%%%%OOOOOOOOoOOOOOOOO%%%;;>66666ww66>;-----%%---%%---;;;9999rrrrrrrrrrrrtttrrrrrrrrrrrllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr999rrrrrrrr99rrr999rrrrr999rrrrrrrrrrrrrrrrrrrrrrrrrrrrr6666wwrrwwwwwwww99999999rrrrrrrrrrrrrrrrwwwwwwwwwwrrrrrrrrrrrrrrttttttttrrrrrrrrrrrrrrrrzlrrrrlzllrrrrlllllzzzvvvvvvvvvvvvvvvlllrrrrrrrrttttttttrrrrr000r000000r000rrrllzzzzzzllllllllrr0777770007777777777777777777777777777777777777777;;---;;77700000000777777000000000rrrrrrrrrrrrrrrrrrrrzzrrrrrrrrzzzzzzzlzzzzzzzzzzzzzzzzzzzzzzzzllrrrrrrrrrrrrrrrrzzlrr0rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr",
+"rrrrrrrrrrrrrrrrrrrrrrllrrrrrrrrrrrrrrrrrrrlzzxxcccccccccxxxcNNNccccccxxccccxxxxxxxxxxccxxxxxcccxxccccNNccccNNZZxxxxxccnxxccnnZZmccccxxxvvxxxxxxxxxxvtttttvxcnZZxvvvxxxxnZZZZZZZZZnnZZZZxxxxccccxxxxnnnnnnnnxxxvnnnnncccnnnnnnnnccccccccnnnnnnnnnnnnnnnnnnnccxxxnnnnnnnnnnZZZZZZZncxxxxxxxxxxvzzttttttttt8>6rttw68rtxxxxvtr86wtxZnxxtw68rrrrtxnZZZcccnZZxcZZnccnZxttvvrr66997666r07666;-667777666rtrtcZxwrrtrw6666ttzzxZxxxzzzzzxxxxxxxxcxxxxxccxxxxxxxtuwww66>>++@oooOOoOOOOOOO%%--;;--;;-%%%%%%%%OO%%%%%%%***:9999rrrr99999999wwwwwww96669999977999977wwwwwwwwrrrr9999rrrrrrrrwwwwwwwwwwwwwwwwrww999wwwwwww99999977999666679wwrrrrrrrr66677999www9997799999999www6666wwwwwwwww66666666>>>>>>>>>>>>>>>>;;;;;;;;;;>>666666wwwwwutttrrtttrrrrrrrrzzztttttttrrrrttrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrwwwwwwrrr00077000000rr000000rr00rrrr00rrrrrrrrr0777700777700000077777777777777077777777777777777777777000rrrrrr000077700000000rrrrrrrrlrrrrrrrrrrrrrzzrrrrrrrrzzzzzzzzzzzzzzzzzzzzzzzzxxxzzzzzlllrrrrrrrrrrrrrrlzzzzrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr",
+"rrrrrrrrrrrrrrrr000000rrrrrrrrrrrrrrrrrrrrrrrrllxxxxxxcccxxxcNNNNNNNNcccxxxxxxxzzzzxxxxxzzxxxxxxcccccccNZNNccxccxxxxxxvvvxxxxxxxZZZZZmmmvvvxxxxxxxxxxxxxvvvxvvttxxvzzvvxxxccnZZZZZncxccccnnnnZZZnnnnnnnnxnnnxxxxZZZnnnccnnnnnnnnccccccccnnnnnnnnZZZZZZZZZZnccxxxnnnnccccZZZnccccZZZZZcxxZnxxztrrtttvxxxxw68txxr66wtxnnxxrw866wtxxtttr66666666wrtw767rrttnnccxxxxnxttzztrrrrrrrrwrr00rtrrrrrrr076rzvzxcnxtzxcxvrrzxxxxxxnxxxvzzzzrtvxxvvxzzttvxxcrrrtzxttxyttuuuu=+OoooooooOOOOOO%%%%%%%%%OOOOO%OOOOOOOOO%%%%****6666666677799wwwwwwwwwwwwwww9999wwwwwwwwwwwwwwwwrrrrw997ww9999wwwwwwwwwwwwwwwwwwwwwwwwwwttuwwwwwwwwwwwwwwwwrrrrrrrrrrrttwwwwwwwrrrrwwwwwwwwwwwwwtww66>;;;;;;;;;;--------%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%-;;>wurrrrrrrrrrrrrrrrrrrrrrwwrrrrrrrrttttttttrrttttttttttttrrrrrrrrrrwwwwwwwwwwwwwwww00000000777000000000000077000000000000000777777777777777777777777777777777777777777777777770007777777777rrrrzzzzllllllllrrlzzzzzzzzzzllllrrrrllzrrrrrrrrzzlllzzzzzzzzzzzzzzzzzzzzzzzzzzzzlllrrrrllrrrrrrrrlzzzllllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr",
+"rrrrrrrr0000000077777700rrrrrrrrrrrrrrrrlrrrrrrrzzzzzzxxxzzzxcccccccccccxxxccxxzzzxxxxxxzzxxxxccccccccxxNNcxxxxxxxxxvvzzvvxxxxxxmmZZZZZZmmmcccccnnnZZnncnnncxttrxxxvvzvvxxxxxxccZcxxvvvxxxxxxcccnnnnxxxxxxxxxxxxnnnnnnnnnnnnnnnnccccccccnnnnnnnnccccccccZZnccxxxnnnccxxxxxzttvxxxxnZZZncZncxxxvzxxxnnZZZttxZZnvrxnnZnxtrrtttrrrt866rrwwrww8666686;-;67wwvtrrtvvzrrwwrrrrzr69txvtr07rxNNccxxtr076trrvxzvxxxnZZxxzZcxxxxxxncxxvvzzwrttrrrr6666667wrw766666-----;;;==OOOOOOOOOOOOOO-%%%%%%%%%OOOOO%OOOOOOOOOOOO%%%%------;;;>>>>666>>>>>,wwww666666666666666666666666666>>>>;;;;;;>>>>>>>>>>>>>>>>>>>>>66wwwwwwwwww6wwwwww6wwwww666>>>666666666666666666666666666666>>;--%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO*>wrw9779wrrrrwwrrrww666666wwwttwwwuwwwwwwuwwwuuuttttrrrrrrwwwwwwww66666666wwwww6667770000067700000777777770rrrrr0070000000777777777777777777777777770000077777777777700000777000007777777777770rrrxxxxxxxxzzzzxxxxxxxxxxxzzzzllllzllrrrrllzzlrlzzxzzzzzzzzzzzzzzzzzzzzllrrzzlllrrrllrrrrrrrrrrrlzzzlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr",
+"rrrrrrrr7777777700000rrrrrrrrrrrrrrrrrrrllrrrrrrrrrrllzzzzlzzxxxxxxxxxxxxxxcccxxxxxxxxxxzxxxxcccxxxxxxzzxxxxxxcNzzvvxxxxxxxcnnZZxccccmmZZZZmmcccnnnncxvtvxcZZZZZncxxxvvvzvxxxxxxcxxzttttttzzvvxxnnnxxxvvxxxxxxxxxxxxxnnnnnnnnnnnnnnnnnnnnnnnnnnnxxxxxxxxZZnnnxxxnnnnnxxx8666wtxnrtxZZZnnxxnnZZZZxxxxxxxxxnZnttxZxxxvttrwttxxt86;866ww86wwrrtttttvrrrtvvvw6;6rtzt66799rrtxr66rxxvxrrrzxtrZNcxxxxxxrtxnvxZnZZZZncxZxttxxxxvztrrrrr9rrr7666rrwwrrtz76;;;6>;-;;;>6ww>*OOO%%O%%OOO%%%66>;--;&&&&%OOOOOOOOOOOOOOOOOOOOOOOOOOOOoOOOOOO%%*&&=;>>&&&&-%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%OOOOOO%OOOOOOOOOOOO%%&&&&&&&&;;>>wwww>>;;--%%%%OOOOOO%%%%%%%%%%%%%%%OOO%%%%%%%%%%%OO%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%OOOO&>rrw88wrrw888888wwwwwwwwwwwwuuwww>>>>>>>>>>>>>>>>666>>;;;;;;----->>>>>>>>>>>>;;--66666qqqqqqqqqqq77777700rrrr007700wrrr00rrrrr00070000000000000000rrrrrrrllrrrrrr00000000rrr0rrrlrrrrrrrrrrrrrrrrzlllllllzzzzxxxxxxxxxxxxxzzzllllzllrrllzzllrlzzxzzzzzzzzzzzzzzzzzzzzzlllzzzllrrrllrrrrrr000rrrzzzlrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr",
+"rrr0000000000rrr00000007000000rr00rrrrllrrrrlzlrzzzzzzzllzzzzzzzzzzzxxcNccccccccxxxxxxxxcccccccccccxzzxcxxxxxxxxzvxxxxxxvxxxxxxcZmccxxxxcccccmmZnnnnxvtrtvvtttxncxvtrtvxxxxxxxxcZZZcxxnZcxxxxxxcxxxxttvxvvvvvvvvtttttrw6txZZxvxnxxnnnnxxxnnnnnZZAxtxnxxvtttxxnnxxvrwtxr6ttttttw6rtvxxxxnnnnZZZxttvxtr888ttrrwrrrrtxxxtrwttxxxxvtt86rw>6rxxxvxxnZZxw6;69rrrrrrrrrrrrrw977rrrrw976zzzzzzzzNxzttzxNnnnnnnnnnnnnnnnnnnnnnnnnxxxzzvxxvxxxxxxxxxxztrrrrrrrrr6>ww666>;-%%--::-------:6qrww886>>>>=&OOOooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%OOOOOOOOOOOOOOOOOOOO&===%OOOOOOOOOOooOOOOOOOOOOOOOO688wrrrtrrrrrrrrwwww,,>>,,,>>>>>%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%-;www666wwrrwww999wwwwwwwwwwwwwwwwrrwrrrrrrrrrrrr0rrrrrrrrrrrllrrrzllllrrrrrrrrrrrrrrrrrrrllzzzzzzrrrrrrllrrrrrrrrrlzzxcNNxxzlllzzzzzzzzzzrrrlrrrrzzzzzrrrlllllzzzlllzzzzzzzzzzzxxrrrrrrrrrrrrrrrrrrr00rrrzzzzzrrrrrrrrrrrlllrrrrrllrrrrrr",
+"rr00000000000rrr00000077000000rr0rrrlzzzzzzzxxxzzzzzzzzzzzzzxxxxzzzxxccNccccccccxxxxxxxxccccccccxccxxxxcxxxxxxxxxxxxxxxvxcccxcZZZZZcxxxvccccccmmnnnncxxvttttrrtxrrvxZZZZxxxxnZZZcZZZncnZcxxxxxxcZZZZnnnZnnnnnnnnxxxxxxvtvxxxxxxxxxxxxnnnnnnnnnxxw88rw8wtrwwwrrw8ttw66wr886;;66888wrtttttrrtvvtttxxnxtttvrrrrtvxxxxtrwrttxxxxvxxxA6%8ZAt6txxvrrtxZxvttxnZnnncccccccxxxxxxxxxxvzttxxxxxxxxNcxxxxcNmmmmmmmmmmmmmmmmmmmmmmmmcxxxvxxxvvvvvvvvxxvvvvzzrrrrzrw6--%------;77rr00777770rrww6>>;&&%%OOOOoooooooooooooooooo................oooooooooOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%OOOOOOOOOOOOOOOOOOOOO&&=&&===&OOOOO%&===O%%&&&==OOOOOOOO--;;>>>>>>>>>>>>;&&&&&&%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%&&&&---%%%%-;>;;;;>6ww666666--;;;>>6>>>66666rrrrtxcmzzzzzzzzrrrrrlzzlzzzzzzllllrrrrrzzzzxxxxllrrrllzzzxxcccczzzzzzzzxxzzzrr0rrrrlzzzzzzzzzzzrrrrrrrrrrrrrr00700rrllzrrrrlzzzllllllllrrrlzxxccxxzzrrrrrrrrrrrrrrrrrrrzzzzzzrrllrrrrrrlllrrrrrrrrrrrrr",
+"000000000000000000000000777000rrrrrlzzzzxzzzxxxxxxzzzzzzxxxxxxxxxxxxxcccccccccccxxxxxxxxxxxxxxxxzxccxxxcxxxxxxxxxxxxxvtttvxxvxxcZZmcxxxxxxccccccnnccnnnZvvvtrttvrrzxxxxvxxxxxxcnxxZZnxxxccxxxxccZZZZZZZZZZZZZZZZnnVVVVnnVxyxnZVxnnnnnnnVVnnnnntw%;88>;6tw>%%;wynwuw88wtww8>;>688---;;;;-8uttuutnwww888rrttxxnZZAZnvtrtvxZntw668w8--6ttw8txnv868rzzzvxxcnZZZZZZZZZZZZZnnnZZZZZZZZNNNNNNNNNNNccNNNmmmmmmmmmmmmmmmmmmmmmmmmcccxxxxxxxvvvzzlvvvxxxxxvzvvxvrr---;;>>;770llllr77777777>>;&&%%OOOOOOOOOoooooooooooooooo.....   ........ooooooooooooooooOOOOOOOOOOOOOOOOooooooooooooooooOOOOOOO%OOOOOOOOOOOOOOOOooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%&&=>>&&&=====OOOooOOOOOO@+===+=====@OO@+===<3@@@@@@@@OOooooOOOOO%%%%%%%%%%%%%OOOOOOOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%&&&&>>>>;>;;%%%%%%%%%%-;----%%%%%%%%%%%-*******->>>66wrtrrrlllrrrrrrlzxxzzzzzzzzzzzlrrrrzzzzzzxxzzzzzzzzlzzxxxxxxxzzzzzxzzzzzzzr0rrrrrrrrzxxcxxzzzzzzzlrzlrrrrrrrr0000000rrrrzzzzzllllrrrrrrlzxxNNcxzzrrrrrrrrrrrrrrrrrrrrrllrrrzzzlrrrrllllrrrrrrrrrrr0",
+"0000000000000000rrrrrrrr77700rrrrrrzzzzzzzlzzxzzxxxxxzzzxxxxxxxxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzxcxxxxxxxxxxxxttttttttrrttrtzxxxxxccZZxxxxxcccncxxcnZZcxxxvvxxxvtrrrtvxxvvvvxxzxxxxxxxncxxxxcnxxxxxxxnxxxxnnnnxxxnxxnnVxyynVVnnnytttttxytyyt6--;88>>wnnt>-;>>;88wwttw8688wuuww8888wwwwyyyytynVxvtttxxnnnnZZZZZvxxxxttrtr6--->6;8xxr6rZnZZxr668rrrrrrrrxxxxxxxcZZZnnccxZZZZZZZZccccccccNNNNNNNNmmmmmmmmmmmmmmmmmmmmmmmmmmccccccxxxxvvzlvvvxxxxcxxxxxxvttrrrrrww0000r0777;;;:--%&&%OOOOOOOOOOOOOoooooooooooooooo.....   ........oooooooooooooooooooooooooooooooOooooooooooooooooOOOOO%&=&&%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooOOO&====<<<===&&OOOooOOOOOOOOOOO++===+@O@@@+++++OOOoooooOOooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%&&&&>>&&&&&&&%%OOOO%%OO%%OOOOOOOO%%OOOOOOoooOOOOO%%%%-;66rrrrrrrr0rrrlzxcxxxxxxxxxxxzzzllzllllzzxxxzzzzzzrrrrrrrrzzlrrrrlrrrrzzzlrrrrrrrrrrzzxxxxcccccxxxxzzzlzzzxzrr0000rrrrrllzzzzzzzzzzzzllllzzzzzzzzzrrrrrrrrrrrrrrrr00rrrrrrzzzllrrrzzlllrrrrrrrrrrr",
+"rrr00000rrrrrrrrrrrrrrrr7700rrrrrrrlzzzzzllzzxzzxxxxxxxxxxxxzzzzxxxxzxxxxxxxxxxxxxxxxxxxxxxxxxxxlzxcxxxxxxxxxxxxtttzvxxxxxxxxxxcxxxxxcmZxxxxxxxxncxxxxcnncxxxxxxxvztzxnZxxxxxxcnxxxxxxcZnncxxcnnvxxxttxxttttvvxxtyyyttyxtttttyxxxytw8666tuwutw;%;-;>68tVnxnZAZt88>>8ww86%;>8uttyuwwttyyyttwtynnnZZnxnZZZxxxvttrr6wtttr666>;;>6rttttxxxttZnxxxxttxxzttrttxxxccnnZZZZZZnnnxxcccnnnccccccccxcNNNNcxmmmmmmmmmmmmmmmmmmmmmmmmmmmmmcccccxxxvvvvvvxxxxxxxccxxvvcxvttttrrr00007:6::::-%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.....................oooooooooooooooooooooooooooOOOOOOOOOOOOOOOO&&&&&&&>>>>>>&&&========>==&&%%OOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooOOOO+++@OOooOOOooOOOOOOOOoooOO@@@OOOOOOOooooOOOOOoooOooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooOOOOO%%%&&&&&&%%&&&&&%%O%%%%%OOOOOOOOOOOOOOOOOOOooooOOOO&&&>6wutzzzzzlrrrrrrzxxcZZNNNNNNccccxxxxxxxxcccNcxxxxxxxzzzzlrrrrrrrrrrrzzrrrr07rrrrrrrrrrrrrlzxzzzxxzzzzzzzzzxcxzzllzzzlllrrrrrrrrlzzzzzzzzllzzrlzzxxxcxzzzrrrrrrrrrrrr00000rrrrrrllzzzzzzlllrrllrrrrrr",
+"rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrllrrlzzzzlxzzzxxxxxxxxxxxxxxxxzzzzxxxzzzxxxxxxxxxxxxxxxxxxxxxxxxxxzxxxxxxxxxxxxxxxvvvxxcZZcnnxxxxcccxxxxxxxxxxxxxxcxxxxvvxxxxxxxxvvxxcxxzttttzxxnZnZncxcZZnnccccnnxnnxxxxxvvvvvvvvyxxytutytttyyyxnnxytw888yttyytw8;%%->8wyytwtnVnyt8>>888w888>>8wt86>8wttu8>>8tyyyvtrrttttttttrrrrrrrrrrrwtttttttvtr8rxntwxxvxZAZZZZcxxcZZnnZZZZZZnnnnnncccccccnnnNNNNNNNNxccNNccxmmmmmmmmmmmmmmmmmmmmmmmmmmZZmcccccccxxxxxxxxxxxxxxccxvxxxxxxxxxtrrrrrrrq6:****%OooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooo...oooooooo........oooooooooooooooooooooooo&&&&&&&&&&&%&&&;,>>>&&&&&&&&>>>>===========&%%OOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooOOOOOOOOOO%&&&&&&&&&;;&%&&&%%OOOOOOOOOOOOOOOOOOOoooooooOO%&>,wyyzxxzzzlrrrlzzxcccxxxzzzzccccxxxxcccNNcccxxxxxcccNNNNcxxzrrrrrrrrrrrrrr0077777777777770rrrrrrrllrrrrrrlzzxxxzzzzzxzzzzzllrrrrrllzllllzzxxzzzxxxxxccxxzzllrrrrrrrrrrrrrrrrrrrrlzzzzzzzllllllllllll",
+"rrrrrrrrrrrrr000rrrrrrrrrrllzzzzllzzzzzzxxxxcccxxxxxxxccxxxxxxxzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzxxxxxxxxxxxxxxxxnZcccxvtzxcxxvvvvvxxxxxxvvxxxxxxvvxxvxcnxxxxxxxzrrtttttzvvxcZZnZZZZnnccnnZnnnxxtvxxxxxxxxxxnnxtwtytwwtyxytxyyyyyxxyyyyxnnnw8>88>>8nw%%%%%%wwttw>8tww8>;;>8tw8wtyyt>88wttttttrttxvttrrttvxxvvvvxxxxZZnxvtttrtvxxZZZxxxnZZZZZZZnnnZZnnnnccccxxxxxcccZZZZnnnnNNNNNNNNccccccccmmmmmmmmmmmmmmmmmmmmmmmmcmmZmccccxxxxxxxxxxxccccxxccxvxccxxxccxxxytttuww:%OOOOOOooooooOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooo..........oooooooooooooooooooo@@;;;;;;;;66;;;;>6>>,>>;&%%%%%%&&&&&&&&&&&OOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOOOooOOOooooooooooooooooooooooooOOOOOOOOOOOOOOOOooooooooooooooooooooooooOOOOOOOOOOOOO%&&&%%&&;&&;&&%OO%%OOOOOOOOooooooOO.oooooooooOO%&>>rrrrrrrrzzzzzzxxzzlrrrrrzzzzzxxxzxxxxzlrrrrrlzxxxxxxxxxzrrrr000077770r00----------;;;777770rrrrrrrrrr000zzzzzzrrxxxxxxxxzzzzzlllrrrrlzzzzzzzzzzzxxxzzzzzllrrrrllzzlrrrrrrrrrrrllzzzzzlllrrrrrrrr",
+"rrrrrrrr77777777000rrrrrzzzzzzzzzzzxxxzzxxzxxcxxxxxxxccccccxxxxxxxxxxxccxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzxccccccccxvztzvxxnZnxvttvvvvvvvxxxxxxxvvvvxxxcxxxnxxcZZZcxxxvxcZZZnxxzttrtxcnnccnZnnccnnZxxxttrrtZnnnxxxxnVVxtwut8;->wtw>wwtyxnnVwwwuttynZnnnu>-;>>6tVZyw%8nZt-%>%%;>;;>>w8>>8ww8tynnytttw88wtttrrrwrrtxxttxnZZnxxvtttttt;;;6rxnxxnZZZnnZZZZZZcxxZZZnncxxZZZZZZZZZZZZnnnnNNNNNNNNNNNccNNNmmmmmmmmmmmmmmmmmmmmmmmmccmZmccxxxxxxxxxxcccccmmxcccxxxccxxxxxxzNNyuuwq>*OooOOOoooooooooOOO%%%%%OOOOOOOOOOOOOOOOoooooooooooooooo...........oooooooooooooooooooo@66666666776;;;67&&>>,>;&;&&&%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOooooOOOOOOOOOOOOOOOOOOOOOOOOOOOooOOOoooooooooooooooooooooOOOoooooOOOOOOOOOOOooooooooooooooooooooooooOOOOOOOOOOOOOOOO%%O%%&&%&&&%OO%&===++@@O@@OoooooooooooooOOOOOO%%700rrlzzzllrrrlzcxxzzzzzrrrrlzzzzzxcxzrr77700rrr00rrrrrrrr007777777777--------------;----;777000rrrr0077770rzxxxxxxxccccNNcxxzzlzzlrrrrrrrrrrlzzrrrrlzzzzlrrrrlzzzrrrrrrrrrrrrrrzzzzzlllrrrrrrrr",
+"llrrrrrrrrrrrrrrrrrrrrllrrrlzzxxxxxxxxxxxxxcccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzxxxxxNNxzrrrrvxxxxttxxtttxxxtxvtvvxxvcxvxmmcvmccmmmcxxxvxxxxvxvvvvxxnxvvcZZnvtxxvxZZnZxvZZxtxtw6688>-6rxnxvttxxxxxzr6rzzr66666;--6txn86;-->8w,wutttrr666wtu>&6tu;%->>-->wtttttrrvr;-;vxZZZmmZvvvvyyyiiu>&>wutyuwwww86rr966;--6rvcmmZMZMMMMMMMBBccccNNNNNNNNNNmmmmmmmmmccccccmccccccccccccccccNNNNNNNNccccccccccccccccNNNccxxxxxxxxxxxccccccccccccccccccxxxxxxvxxvr6-O%%%OooO@OOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooo..oooooooooooooo%%&&;;>>---;6666&&&;>>&&&;>>;&%%ooooooOOooooooooooooooooooooooooooooooooooooooooOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOoooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOooooooooOOOOOOOOooooooooooooooooOOOOOOOoOOOOO&==>>>>&&&&&%%%OOOOoooooooooooooooo%-6rttrwtrrrww88rrrrrrll99llvvvvllvvvvvvvllrr99977777777777777;;---------:--------------------77779999rl997779rrlllzzzzzxxxxxccccxvxccxvvvvvvvllrrrrrrrrzzztttttrrrrrrrrrrrrrrrtrllzzllrllllllll",
+"77700rrlrrrrrrrrrrrrlzzzllzzxxxxxxxxxxxxxxxcccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzNNxxzrrrtvxxxxxxxxxxxxxvxxvvvxvvmcxcmmcvcxxxxxvlvvvxxcxxxxvvxxxcZxttxnncvnZnnZnxtxxt6;8vtrwwrw66>6rtttttxttttztt6ww6wttrw6;--6tnxtw6>>66%&wtxxxxtw6-;>wu8w6;8yt6%-;8wuuwrwwrw666vxnmcxcmZxxyyyyuw>&&>686&&>wyxnxrtttvvvvZZZmcmmZmmmmmmmmBBccccccNNNNNNNNmmmmmmmmZmmccmmZNNNNNNNNNNNNNNNNccccccccNNNNNNNNNNNNNNNNNNcccxxxxxxxxxxxcccccccccccccccccccxxxxxxxxzr6;-%OOOoOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooo..ooooooooooooooO%%%%%-->>>>>>;;>;&&;&%%%%&&;;&&OOOOOoooooooooooooooooooooooooooooooooooooooooooOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOoooooooooOOOOOOOooooooooOOOOOOOOOOOOOOOOOOOOOO%&&&&%%%%%&%%OOOOOoooooooooooooooo%-;66888ttttttttvvvvvvlvvvvvvvxxllllvvvvvvvvvvvvrrrrrrrrrr9977;-777-------%%%%%%--------;--;7777-------;76;6679rlllllrrrrrtzxccNcxxxcccccccccxxvzzztttttttttrrrrttrrrrrrrrrrrrrrrllzzllrrrrrrrrr",
+"77770rrrzllrrrrrrllzzzzxzzxxxcccxxxxxxxxxxccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzxxxxxzzzxvtvxxxtxxxxnxxtvtrrttrrrrrlvxxvxxvvxxxxxxxxmmcxvvxxxxxxZxtttxxxxnZnxxtrtr668r8;wwww88668wttttttzttrwrtxcxtwww6-uuw6;>wyxxytw8>;%&8utvxcnnnxytuytytttxu;wuyxytwww86;6666nZZZZnZZZxttyyw>&%O%&&&%OO&>wwwwwtvnZZZZxxxnZmmxZZZZZZZZBBBBBNNNNNNNNNNNmmmmmmmmZZmmmmZZccccccccccccccccccccccccccccccccNNNNNNNNNcccxxxxxxxxxxxxccccccccccccccccnccxxxxxvzzrw6>>&%OOOOooOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooo..ooooooooooooooOOOOO%%%>>>>>>;;>;&&&%%OOO%%&&;;=+@OOOooooooooooooooooooooooooooooooooooooooooooOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooOooooooooooooooooOOOOOOOOoooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOooooooooooOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOO&%%OOOOOoooooooooooooooo%%%%--;>666688wwtttttttlxvvllvvxrrrrrrrrrrrlvvvvrrrlllvvrrrrrrrrrr0777::::::::--:::------%--------;;-------;;66600000rrrrrrrrrrlvvxxvvxxcccccccxxxxxxxxxztttttttzztttrrrrrrrrrrrrrllllrrrrrrrrrr",
+"rr000rrrllrrrrrrllzzzzxxxxxxcccNxxxxxxxxccccccccccccccccxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxzzzzzxxxxxnxttttrrttvxxxtrtrrrttrr899rrrrrrrrrtxnnxvvvxxttttvxxtttvttvxxtttttttrrwrr88tZt;8rrr8666txxxxxvtxxtw66wtrtrrrttwwtyytw88wtxnnyw6>&--;6rxrvnnt>&%rnAZtr6>8rttw6;-rr6;6rr;ttxnnxxxttuuuw>=OOOOO%OOOO%%%%%%-;>6wwww6;;6rvxxZZZZZZZZNNNNBBZZccccNNNNccccccccmccccccmccccccccccccccccxxxxxxxxccccccccNNNNNNNNcccxxxxxccccccccccccccccccccccccnccxxxxxzzzlrw6>w>;&OOooOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooo..ooooooooooooooOOOOO%%%%&&;>>>>;&%%%%OOOO%%%%%%++OOOOooooooooooooooooooooooooooooooooooooooooooOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOooooooOOOOOOoooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOooooooooooooOOOOooooooooooooooooOOOOOOOOOOOOOOOO%%%%%%%%&%%%%%%%OOOOOOOOOOOOOOOO%%OOO%%%%%%%%%--;;>668wrrrrrrrrrttttrrrrrrrrrrrtrrrrrtttrttvxxccrrrrrrrrrlllllrrllrrr07776667777669w866666666668777770rrttrrr0009rrr99rrrrrlvvvvxxxxxxxxxxxvvvvvzztttrrrrrrrrrrrrrllllrrrrrrrrrr",
+"lrrrrrrrrrrrllzzllzzzzxxxxxxxcccxxxxxxxxccccccccccccccccxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxzzxxxxzzxxttrrrrtttxxxtrtrrtvvttvvtrr8666666wttvtrrttttrttttttrrrrrrtrrwtrww8wrt>vZt8wtxtxxxtrrrttvxxxvtxxxtw6wrwtxtttttwutyxtw68wwtttyy>&--%-6vnxt>%OO%-wxxtrww;6wrrw86rrr9rcv866wtyyuwwuuw>&OOOooOOOOOOOOOO*&>>>wwwwwwt6-%;rxZZZZZZZZZcccccccccccccccccccccccccxxxxxxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccxxxxxxccccccccccccccccccccccccccxxxvvvrrzvtr6>w3,=OOoOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooo..ooooooooooooooooOOOOOOOO%&&>>>&%%%%%%O%%%%%%OOOOOOOOooooooooooooooooooooooooooooooooooooooooooOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooOoOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%&&&&&&&%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%-;;>668rrrrrtttwwwwwwwwwwwww6688wwwwttttttuwrrrrzzxxvxxccxcczzzxxzzzxxxyytttttvvvtxxttttttttlr000rrrtttttzzzrrrr97799rrrrrrrlllllvvvxxvvvvvvttrrrrrrtttrrrrrrrrllrrrrrrrrrrr",
+"rrrrrrrrrrrlzzzzlzzzzxxxxxxxxxccccccccccccccccxxccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxccccxxxxxtrrttttrttxxxxxxxtrrwrrttrw9rrrrrrrrw9wrrtrtttvxncxtttttrrrrw6666wrtr88wwtxtxt866txtxnnxttt666wrtvvtzxxttrrtxZzrww6uw68wtww8>-%%;wtuuut8;;rZcr>-%&;;-;8tvr6rrrvxcxt99rrvxtw8wuyViyuwuuw&OoooooooOOOOOOOOO=>3wwuuyyiuuutxVVZZZZZZZZZZZZZNcxxccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvzttt770rw6-%%&>&OOO@OOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooo..oooooooooooooooooooooOoOOO%%%%%OOOO%%OOOOOOOOOooooooOOooooooooooooooooooooooooooooooooooooooooOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooOOOOOOO%%%OOOOOOOOOOOO%*&&===+OOoooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%&&&&&&&&&&&%%%%%%%%%%%%OOOOOOOOOOOOOOOO%%%OOOOO%%OOO%%->6wutrw8www86>>>>>>>;;------;;>>>>>>>>>>wqq00rrrrrrlllvv0rllzzzzttyyyuuuynVVVVVVVVVVVnnxccvzrrrrqwrtzxxczvvlrrrrrrrrrrr99999rrrrlllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr",
+"rrrrrrrrrrllzzzzzzzxxxxxxxxxxccccccccccccccccxxxccccccccccccccccccccccccxxxxxxxxccccccccxxxxxxxxxxxccxxxxxxxxzrrtxxxttxZxxxxxxttrrrrrw6666wrrtxxxvvxxxxtvttvxxxtxytttuuuww6>>6wttw8rrrtnZr68tttrwrtxvttt66;;8txnrrtzxxtr-66wrtztw8668www8>%%%%->uutxu66t66666>&%6;-69w6;w668rtr8rrrlrr8wwwwueeuw>>>=OooooooooooOooOoooOOOOOO&=33>uVAAZnynnnnnnnnNNNNNNccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvztrrr77096;%%OO%OOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooo..oooooooooooooooooooooooooOOOOO%OOOO%%OOOOOOOOOoooooooOooooooooooooooooooooooooooooooooooooooooOOOOOOOOooooooooooooooooooooooooooooooooooooOOOOooooOOOOOO%%%%--OOOOOOOO%%*&&=======@OOooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOooooooooooooooooOOOOOOOOOOOOOOOO%%%%%%OOO%%%%%%%&&&&&&&&;&&&&&&&--------%%%%%%%%OOOOOOOOOOOOOOOOO%OOOO%%>>8ww86>&&&&&&%%%%%%%OOOOOOOOO%%OOO%&&&&:::--::;77777lll00rrrr07uuuuuw33uuyyyyyyyyyyyyyyBNccxxytuuutttttvzllvvzlxxxxxvvvllrrrrr9rrrrrr99rrrr0000rrrrrrrrrrrrrrrrrrrrrrrr",
+"lrrrrrrrzzzzzzzzxxxxccccxxcccccccccccccccccccxxxccccccccccccccccccccccccxxxxxxxxccccccccxxxxxxxxccccxxxxtzxxcxxxxZZntrxZxvtttttrxvvvtrw6ttxxytyxytyxnnxxtuwww6>;nxytttttwwuuutttr88rtrtxrwtZZttx68rtxxvtt8;;6tnZrwrtztrw66666w6;>8utwwwwww86>;;-OO%;>;rZ88wtxnyu-;66;;6r86;8xZnvZcxmv66w;%OOOOOO%OOOOoooooooooooooOOoooOOOOO==34yyyuwwuywwwwwwww,qwuyxxxcccccccccccccccccxxxxxxcccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvvztrrrrxzzrr6>>%OOOOOOoOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooo..oooooooooooooooooooooooooooooo%%OOOOOO%%OOOOOOooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOoooooooooooooooooooooooooooooooooOOOOOOOoooOOOOO%%%----;********>>>==&&&OOOOOooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOooooooooooooooOOOOOOOOOOOOOOOOOO%%%%%OOO%%%%%***;;------>>;;----;;;;;;;;%%%%%%%%OOOOOOOOOOOOOOOOOOOOOO&&>>>&&&-%OOOOOOOO%%%OOOOOOOOOOOOOOOOOOOOO%OO%%%--77777lvbzzzl07:-%%%%O@oo&=333=&%,3wwuuuuccZZZZVVAAVNytrwrr9rtvtrzxxcZZZZcccvvvllllrrr999000077770000rrrrrrrrrrrrrrrrrrrr",
+"rrrrrrrrllzzzzxxxccNNNNcccccccccxxccNccxcxxxccxxxxxxxxxxcxxxxxxccccccccccxxxxxxccxxzzxxcccccccxxxxcZZnxtxxxxxxxxrtxxxtrrxrwtvvvx7rvtrrtnnxttuww8xxxxxxyyyytw;-;6Zntwwuyntxxytw>-;rtw6wr8rwwrr88wr8;>xZnnxr68rrrwt6-;wtxxtzzr666wwuw>8yt66;>w8>8y>w>-wxxxZt6>wtuw6669tvvttxZZZxtt9rrrr86>&&OOOOO@OOOOooooooooooooooooooooooooooooOOOOOOOOOOOOO%%%OO%%*;;6rvcccvcczzvvxxxxxxxxxxxxccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxNNcccxxxxxcccxxxczzlttww%%OOOOOOOOOOOOOOOOOOOOOOoooooooooooo....oooooooooooooooooooooooooooooooo..oooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOooooooooooOOOOOOOOOOOO%&&;>>>666>==&&%%OOOOOOOOOoooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOoooooooOoooOOOOOOOOOO%%%&&&&&&&&******%%********>>;;;-----;;;;------------%%%%%%OOOOOOOOOOOOOOOOOOOOOOOO%%%O%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OO%;6zvvlllvv0rrllr07-%%OooooooOOOOOOOOO%%%%%7lcZyuyiyyiVVyxxtcxrwtvrrtztrrzxxxcccmmZcxvvxxvrrrr0076;770rrr0000rrrrrlrrlrrrrz",
+"lrrrrrrlllzzzzxxxxcccccxccccccccxxcccccccxxxccxxxxxxxxxxcxxxxxxcccccccccxxxxxxxxxxxxxxxxxcccccxxcxxxxxxxxxxxxxxxrtxxtttxxttttrrrvvvvtrw8668wwwwuuyxVVyuwww>%O%>wxtw66wutwww88wwwtxxwwvxvr88rrrrttt86rr8rrrw668wwtw66rtw66wrrw6wrtyu;>wtw6>wnnw68>uw6wtrvnt66wyVVrrrrttttwrttrw88vxcnZVVVyyew3=OoOOOOOoooooooooooooooooooooooooooooOOOOOOOOOOOOOOoOOOO%%%;6lxxxcmxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxNNNNNNNNxcNNNNxxvzzzvztu&%OOOOOOOOOOOOOOOOOOOOOOoooooooooo......................oooooooooooooooo..ooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOoooooooOOOOO%OOOOOOO%&&&;;>>;;;;%%%OOOOOOOOOOOOOooooooooooooooooooooooooooooooooOOOOoOOOOOOOOOOOooooOOOOOOOOOOO%%%%%%%&&&&&&&&&&:---------------------%%%%%--%%%-------;----%%%%OOOOOOOOOOOOOOOOOOOOOOOOO%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OOO->wrtzvvvvrrrrlr006;%Ooo..ooOOOO%&OOOOOOOO;696;%%%%%*>>>>wrxntrttrzxxvttzxcccccmZZmcccZZZcNxrrrr00-:;67700000rrrrrzzzzllzx",
+"lrrrrlzzlzzzzxxxxxxxxxxxccccccccxxxccccccxxxccxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxccxxxxxccccxxcxtrtxxxxxxxxxxxvnZZttxZttttw666r99rvvr6-;>8,wuyyyyyu6;%-%OOO%>8>;-%%-;>wwwwwyyyZZxw8tt8r86wrw8w8tw66--66tt868rw666rttr6>6rttttttxt6>wttt88ttw6w>yyutrwtxtw8wuyyyyttuuttyyyttttyvvyxnVVAVdyw>@ooOOOOoooooooooooooooooooooooooooooooooooOOOOOOOOOooOOOOOOO-6rzvvxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxNNNNNNNNccNNNNNcvlrrrw6>&%%OOOOoOOOOOOOOOOOOOOOOoooooooo........................oooooooooooooooo..ooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOoooooooOOOOOOOO%%%%&&;>>;&&&%%%%OOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooOOoooOOOOOOOOOOOoooOOOOOOO%%&&&&&&&&&&&;&&&&&&&&--------%%%%%%%%%%%%%%%%%%%%%%%%%%----;;;;---%%%OOOOOOOOOOOOOOOOOOOOOOOOO%OOO%OOOOOOOOOOOOOOOOOOooooooooOOOOOOOOOOOOOO%-;6wrrrrwrrrrrllr6;%OooooOoOO@=>3wwuuuuuurrtw>:%%OOOOOO%%;rncxZZZZZZnxxxcxxxxcccmZZmZZZZZZZNxxxxxrrr00000rrrrrrrrzzzzzlzx",
+"rrrrrlzxzzzzzxxxxxxcxxxxxxxxxxxxxxxxcccccxxxccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccxxxxxccccxxvtrtxcnxxxxxxxxxZZZxtvxrrrr866wr97rxcxtwwuwwwwwyu,&%OOOOOO%%&%%%%%%%%%-wwuwwuuwwrw6666>tr8ww66>;866666trxntrvxtwwrtxxxtrtxxxxxxtxnxxxxytw6wwwwwwyyuttrvvtr86>>>wwww>6wuuuuuwuyy8>>>>,www3=OOoOO%%%OOOoooooooooOOOOooooooooooooooooooooooooOOOOOoOOOOOOOO%>688wrrrvxxxxxxxxxxxxxccccccccccccccccccccccccccccccccxxxxxxxxccccccccccccccccccccccccxxxxccccccNNNNNNZNcxxtww&&%OOOOooooooooooooooooooooooo..........................oooooooooooooooo..oooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOoooooooOOOOOO%%%&&&>>>;;&&%%OOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooOooooOOOOOO%%%%%OOOOOO%%%%&&&&;;;;;-;;;;;;;;;;;;--------%%%%%%%%%%%%%%%%%%%%%%%%------------%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%OOOOOOOOOOOOOOOOooooooooOOOOOOOOoOOOOOOO%&>>>;--:::7700r6-%OOoo@ooOO==>3wuuyyxnnZZZVVyyeu33,>&&>;rcZZZAAZZZZZZZZxxxxxcccncxxztrrxxNZZZNxZZxxtrrrlrrrrrrrllzrrrrl",
+"rrrrrrzzzzzzxxxxxxccccxxxxxxxxxxxxxxxxcccxxxccxxxxxxxxxxxxxxxxxxxxxxxxxxccxxxxccxxccccxxxxxxcccxxvtvxcncxxxxxxxxvvvxxxttttrrw6wtvrrrtttyVyuuw3=%&%%OOO%%OO%&>>%O;;>>>>>>>6>>;>;%%;>;;6rtZvrttr868trrxxxZxZZxxZZxZZxxxxxxxccxxxxZVVnnZZnt66wxVxtwuywwytrtrttt8>%%%%&%%%&>O%%%%%%&&%OOO%%&*OOOOOOO%%%OOOooooooooOOOOOOOooooooooooooooooooooooooooooooOOOOOO%%%&;>6rrvxxxxxxxxxxxxxccccccccccccccccccccccccccccccccxxxxxxxxccccccccNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNxzzvztww&&%OOOooooooooooooooooooooooo...........................oooooooooooooooo..oooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOooooooOOOOOO%%-;>>>>>&&&OOOOoooooooooOOOooooooooooooooooooooooooooooooooooooooooOooOOOOOOOO%%%%%OOOO%%%%------------------------%%%%%%%%%%%%%%%%%%%--------%%---;;-------%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%OOOOOOOOOOOOOOOOooooooooOOOOOOOOOOOOOOOOOO%%OOO%%----;77;--%%OooooOO+&&&&;>>68wrttttyyeeVddyyuyVtxZZxxxxZZZZZZZZZZZZZZZZcxxztrwwzrrzxxxxcxxxxxcNxxxxzzzzrllrrrrr",
+"rrrrrrlzzzzzxxxxxxxcccccxxxxxxxxxxxxxxcccxxxccxxxxxxxxxxxxxxxxxxxxxxxxxxcxxxxxxcxxxxxxxxzzxxcccxvvvxnnnxxxxxxxxxtttxZZZxxtrr866w797768ryyyww>&OOOOO%%%OOOOO%&>>;6wwwuuuuww8>;>wwwrw6;6tnZxtxZnxxxZxvZZxZZZnxxxxxxztrwrtxxxxxxxcZVywwutw6;>6wtyytyu88tt9rrrvytw>&OOOOOOO%O%%%%OOOOOOOOOO%OOO%*%OOOOOOOOoooooooOOOOOOOOOOooooooooooooooooooooooooooooooOOOOOOOO%;>rrvxxxxvxxxxxxxxccccccccccccccccccccccccccccccccxxxxxxxxNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNvlrr96-%&%%OOOooooooooooooooooooooo.............................oooooooooooooooo..oooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOooooooOOOO%%--;;>>>;&%%OOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooO+&OOOOOOOOOO%%%%%%%%;;;;;;;----%%%%--------------%%%------------------------;;---%%%%%%%%%OO%%%%%%OOOOOOOOOOOOOOOOOOOO%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOOOooOO=>>6777777;;-%OooooOOOOOO&&;;;;;>;;;>>>>=3>33wwuixZZcxxcZZcxxZZZZVVVVVVVVVVVVxxxxZxr00rxNNNcxxxcccccccxxxzzzzrrlz",
+"zlrrrrzzzzzzxxxxzzxxccccxxxxxxxxxxxxxxcccxxxccxxxxxxxxxxxxxzzxxxxxxxxxxxxxxzzxxxxxzzzzxxzzxxxcccxxxxcncxxxxxxxxxxvvxnZZnxtttr866;76668rtwuuw&OOoO%%%%OOO%OOO%&>>>,wwuuwwyyuwwuyyxxtr866wxrwtZZnnxZxxnxtxZxxxtwrn66w66wtxxxxxxxxxw6>>66>;;;;->wxV,w>wtr8ttttttw>&OOO%&;>>wuww>;&&OO&=====OO&>>>>&;-&%OOooooooOOOOOOOOOOOooooooooooooooooooooooooooooooooOooooOO%&67rlxxxxxxxxxxxxccccccccccccccccccccccccccccccccxxxxxxxxNNNNNNNNNNNNNNNNNNNNNNNNNNNNxxxxxxzrrrrrcxzlr6-%%%OOOOooooooooooooooooooo...............................oooooooooooooooo..oooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOooooooOOO%%-;;;;;;--%%OOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooO+==OOOOO%%%%%%%%%%---;;;;;;;;;--------------------------------------%---------%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOoooooooo@+qq00099777;-%OoooooOOOOOO%%%%%%%%%-%%%%OOoOO%%&>w6wrtxxxtrwwrrrrwwwwwwwwwuttttyxczr00rzxNNNNcxxxcccccxxxxxxxzlzz",
+"zzzlrlzzzzzxxxxxrlzxxcccxxxxxxxxxxxzxxxccxxxccxxxxxxxxxxxxxzzxxxxxxxxxxxzzzzzzzzxxzzzzxxzzxxxccccxvvxccxxxxxxxxxvvtrwwrtnxxZZvw6vvvlttrw6uyu&OO%OOOOOO%%OOOOO%&&>,wwwwww>wwwwuw>66rvxr6;w6>wvxvtvZnxnxxZntxnr;6ZwtzztrrtxxcZZxtt-;8uuw88%;6wwtyx%;>wyrwcnxtw6;%O%%&>uyyyyye3=*%%2334w333O%&>wuyyxytw>=%OoooOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooOOOo%-;9lxccxxxxxxxxccccccccccccccccccccccccccccccccxxxxxxxxNNNNNNNNNNNNNNNNNNNNNNNNNxxzzrrrrrr07777------%O%OOOOOoooooooooooooooooo................................oooooooooooooooo..ooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOooooooOO%%&;;;;-;-%%%OOOOooooo..ooooooooooooooooooooooooooooooooooooooooooooooooooO===Oo&&&&&&&&--------;;;;6666;;;-----;;;;;;;;--------%%%%%%%%-%%%%%%%%%----%%%%%%%%%%--------%%%%%%%%%%%%%%%%OOOOOOO%OO%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOoOOOooooooooo*:>709997--%OOOOoOooOO%%O%%%%---%%%OOOOOOOOOOOOO-%%->>-%-%%%%%%%OOOOOOOOO%%%%%-;6670rrr0rrtxxcccxxxxxxxxxxxxzlzz",
+"wwuuwwtxzzxcxxzzcxvvvxccxccxxNxzvxcnncxvxxcccmmmxccmcccccmmccccxZrxZtrnxvvxxxxvvc9cm9vAvmcxmMMccmMZZZmmcxxxxxxxxcvrvxmxvvvcmmmcxuuuyyyyiiw>>>&%%ooooooooooooo@=2wrrrw9wrtr89rttr66666888uwwwuu6;6rvcxt96wxnxt66x8tr;6vxrvnnr;-rnZnr>6rr86%6w-6xv-;66wuw;8ww6>;68-->wtyxxtttw>;>6uwwwwww6>;%%%-;-;ww>>w>OOOOOOOOo%OOOooooooo.....ooo@oooooooooooooooooooooooOOOOO;;;;6rtxvxxxvxxcxcNcxxxxxxxxxxxxcccccccccccccccccccccccccccccNNNVVVVVVZZxccmccxxxxxzl07666q0rrrq>;%OOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOO----%%%%%&Ooooooooo@ooooooooooOO-O%;ooo@oo@ooooOOOOO%%%%OOOOooooooooooooooooooooooooooooooooooooOOOOO%%%>>>>>;--oooooooooooooooooooooooooooooooo%OOOO%----%%%%OO%%OOOOOOoooOOOOooooooO&;&>>;;;--%*:>>:*%******::*******%********-----%%%%%%%%%%%%%%%%%%%-------%%%%--------;;;;;;---------------%%%%%%%%%%%%%%%%-;;;;;;;;;;;;-%%oooooooooOOOoooo%OOO%OOOOOOOOOOO%%-%%%%%%%%%%%%%oOOOooOOOOOOOOOOooooooooooooooooooooooooooooooooOOOOOOOOOO%%%---%%%%%%%%&>>wuyyyytutttrrzrllllll",
+"uuuttutztzxxxxxxccccxxxcxccxxNcznnnncxxxxxxccccccxvvxxvlxxxxvvxxvvvrrnZrxxvttvxxvvMxrmZ6nxvvvcMMvxccmmmcmnnnnnnnZnxxxnxv88rrtrrr>>>>,3www&%%&%OOooooooooooOO==23wrrrrrrr68rttr6;888wwwrrw88wttw669rttrw66rrvxr69tvr66tnxcZZxr6666888rxvrt>68->xx6;%->6;-%--;;>66%>tVnyuwytw86666>>>6ww6>uw>-----&>>&&>>%>>;&*OOOOOOOOOO@oo......oooooooooooooooooooooooooooOOOOO;;----;;txnnnnmmxxxxxxxcxxxxxxxxcccccccccccccccccccccccccccccNNNVVVVVZZnxccmmccczzzzlr0076q0rttr,>%OOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOO--%%%%%%OO%OO@@oooo@oooooOOooOOo%OOOoooooooooOO%OOOO%%%%OOOOooooooooooooooooooooooooooooooooooooOOOOO%&&>>>>;;--ooooooooooooooooooooooooooooooooOOO%%-;>;;;&&%%O%OOOOOOOooooooOOoooooO&&&--;;;;;*:>>>>:*******::****************-----%%%%%%%%%%%%------------------;;;;;;;;;;;;>;;-----------;;;------%%----%%%%%%------%-----%%OOOOOOOOOOOooooOOOOOOOOOOOOOOOOO%%--%%%%%%%%%%%%ooOoooooOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooOOOOOOOOOO%%%%%%%%%%%%%%%%%%&&&&>>;;6wtztrllllll",
+"twwtyttttzzxxcNNccccxxxxxxxxxNxtxytttvxnvvvvvvvvtw8wyVnxyyttyyyxZAntxZvrttttttttxrlmZxxnZZZZmxvvmmmmmnnnxxxxxxxxyuwwww,>%%&&&&&&OO%%%%%%*OOOOOOOoooooooooO==33338wttuwwwwtyxtw6;wwwwuuttwwwwttw866888www666wxt66tr86>8tZxxnZZxr8866;6rxxx866-6xZZw->w866%%-6wutu6txxtutyyw6;>6>;;>8wwwwww6;--;>>>w,>wyyyuww,>>;;%%%%OOooooooooooooOOOooOOOOOOOOOoooooooooooOOOOO%%-;>>>>6wtxxxxczxxxxxxcxxxxxxxxcccccccccccccccccccccccccccccNNNVVVZZZnnmcccccccxxxzzlrrrr00rrwq;&%OOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOO%%%%%%%OOO%Ooooooooo=ooOO@OOO=Oo%OOOoooooooooOO%OOOOO%%%OOOOooooooooooooooooooooooooooooooooooooOOOO%&&&;>>>;-%%ooooooooooooooooooooooooooooooooOO%%&;>>;;>&&&%OOOOOOOOOOOOOOOOOOOOOOO%%%%--;;;6***::*****%%****%%%*************-----%%%%%%%%%%%%%%%%%%%%%%-------;;;;-----;;;;;;;------;;;;;;;;;;;;;---;;;---%%%%%%%%%%%%%-----OOOOOOOOOOooOOOOOOOOOOOOOOOOOOOO%----%--%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOooooooooOOOOOoooooooooooOOOOOOOOOOOO%%%%OOOOOOOOOOOOOOOOOOOO%>wxtlllzvxc",
+"w88wrrtvzzxxxcNNcccccxccxxxxxxtw>>;>6wxVxxvvvvttwwwwyyyuw,,wwwww-86wxtwZttxxxxttxxttt6;w>wyxvxxxZZnxxtuwwwwwwwww=%OOOOOoOOoooOOOOOOOOOOOOOOOOOOOoooooooooO+==333wuyyyuwwyytw>>>w888wwwwww888w86>888888wwtw;>tt68tw66>;8xZxxxZZZZxtw6;6wrt86668xZy;%;6-%-888uynnxutttttynyw6;;;;;>wutuuuyuw>>>8wu;>;&>wuwuuwwwwuuww>&%%OOOOOoooooOO=33=OOOOO%&%OOooooooooooooooooO%&>wwww;;6wrrtvzxcNxxxcxxxxxxxxcccccccccccccccccccccccccccccNNNZZZZnnnmZmcxvvvvxxzllrrrzrrr06:-%OOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOO%%%%%OOO%OOoooooo@oo+oo@+oo@+OO&O%&o@o@ooooOOOOOOOOOO%%%OOOOooooooooooooooooooooooooooooooooooooOOOO%&=;&&&&-%%%OOOOOOOOooooooooooooooooooooooooOO%%&;;;;;;&%%OOOO%&*%OOOOO%%*&&&&&*%O%O%%%%--;;**%%%%**%%%%%%**%%%%***&********-----%%%%%%%%%%%%%%%%%%%%%%%---;%%%-%%%%%%%%%%%%;;-----;;;;;;;;;;;;;;;--;;;-----%%%%%%%%%%%-;;;>OOOOOOOOOOOOOOOO%%*&%OO%OOOOOOOO--;;--------%%%%%%%*&&%%OOOOOOOOooooooooooooooooOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%>wtzxxxxcc",
+"6>6666rxccxxxcccmmmmccxxxxxtttw6OOOO%>uyyyyyvtttweee3=%OOOOO&OOO%xnrw6>tttvvvvtt6ZZwuyw&wuu8>wvxtuw8>;&%%OOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOooOOOOOO,wuuuwww>>&%OO&>>>>>>>>666666666wrrrwww8tr6>w868twwr6-6tAZnxxxxnvxZZxw;-wwrttrrt6--86%%-xtttxnnx>6wynnyuyyt8;;>6>wuuuutyVyywwwwwwww>>>>-wwwwwrtttrw88wuu&&*%OOOo*%&>>=&&=*%=>&&=+@ooooooooooooooO%&&;&&%&-;>66wtxxNNNxxxxxxxxxxxcccccccccccccccccccccccccccccNNNnnnnmmmmZmccccccvvlr0007rrrrrw6-&%OOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOooOOOOo@ooo++OO==oooO&OO=o=ooooooOOOOOOOOOOO%%OOOOOoooooooooooooooooooOOOOOOOOOOOOOOOOOOOOO&&&=;;;&&%%OOOOOOOOOOOOOOOOoooooooooooooooOOO%&&------%%OOO%%&&&&%O%%%%&&&&&&&&&&&%&%%%%%--::****::%%%%%%**%%%%***&********-----%%%%%%%%%%%%%%%%%%%%%%%---;%%%%%%%%%%%%%%%%------;;;;;;;-----------%%------%%%--%%%%%%--;>>OOOOOOOOOOO%%%OO%%&>&OOOOOOOO%%%--;;;--;--------&&&&;;&%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOooOOOOOOOOooooooOOOOOOOOOOOOOOOOOOoOOOOOOOOOOOOO*;yxcxzlll",
+";;66;;rxNccccxxxZZZZncxxzxxtttw;OOOOO&>,,8888666=232+ooo+oooOooo;FF6%66%tw6;;6wtwwuyy3&OoO*%%>>;&&%%OOOOOOOOOOOOooooooooooooooooOOOOOOOOOOOooOOoOOOOOOOOOOOOOOOOO&===&%%OOOOooOO33wwwwwwwwrrrrrrrrrrrw866866w>-6w68r6;-6nZZZnxxnnxnZZxtrrxxxnr;6>>8tw;->xxxxnnnxw6>6tytuutu8;-;6>>>668wwwwww>>>8uuwwuuw888887999rr98wtvxyyyuuwwww>;>>>wuw>>ww>;>32=OOoooooooooooOOOOO%OO&%%>>-;wzxNNNxxxxxxxxxxxcccccccccccccccccccccccccccccNNNmmmmmmmmccccmZMMccxzrr07-:6rttrrw>&OOOOoOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOooOOOooo@@<o2=+=CCOo>e=oO=o4ooooooOO%%OOOOOOO%%OOOOOoooooooooooooooooooOOOOOOOOOOOOOOOOooOOOOOO===>=;&&OOOOOOOOOOOOOOOOoooooooooooooOOO&=;>;;--;;-&%%OO%&&;&&%%%%%%&&&&%%*::>>>:**%%%%%***%%***%%%%%%**%%%*****%%%%%%%%-----%%%%%%%%%%%%%%%%%%%%%%-----%%%--%%%---------------;;;;--------%%%%%%%%%%---------%%%%%%%--;OOOOOOOOO%%%%%%%%%*:*OOO%%%%%%%%-;;;;--;--------%%%*::%O%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooOOOOOOOOOOOOOOOOOOOOOOooooooOOO%%uyxxr077",
+"rrrttrzcNcNcccxvttvxxxxxtxxyytw>OOOOOO%&%%%%%%%%oOOOOoOOe=oO@O+=%--%%;8-6;-%%-;6y;&33e4oooooO%&%OOOOOOOOOOOOoooooooooooooooooooooooooooooOOooOOoOOOOOOOO%%%OOOOOoooooooooooOOOOo3333,,,888wrrrrl88888888;8668;-8>>666;;;8wtyxnVZZxttxnZAxZnxZr->;;;;;;--8uxVZVVVZt6--6wu666>;;;>>>;;;>>>-;>>;;>>*%%&>>>6rrrr9999999999rrnnnnnnnnntwwtyyVywwutw>ww3=OooooooooooooooOOO%&=&%&>>%%&rrxccxxcxxxxxxxxcccccccccccccccccccccccccccccNNNmmmmmmmmcccmmmmmNNcxzrr0%%-6wrtt3>&OOOOoOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@OOOOoO>@o=D=e333CC=O3y32=2@F+o@+OOOO%%%OOOOOOO%%OOOOOooooooooooooooooooOOOOOOOOOOOOOOOOoooOOOOOOO%&&&&*OOOOOOOOOOOOOOOOOOOOOOOOOOOoOOOO==>>;;;;;;;&&%OOO%&&&;-------&&&----;;:::**%OO%%%%%%%%%%%%%%%***********%%%%%%%%-----%%%%%%%%%%%%%%%%%%%--------%%--------------%%%%%---;;---%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%--%%%%%%%%%%--%->w>*%%%OO%%%%%%%%%--;;---;---------%%-;;%%----%%%%OOOOOOOO%%%%%%%%%%%OOOOOOOOOOOOOooooooooOOOOOOOOOOOOOOOOOOOOOooooooooOOO*qtxzr00",
+"ZcnZAZZZccNNBcxv;>6rtyxyuyyyyyuwOOOOOOOOOOOOOOO%%OOOOOO%V3OO**>wD-%86%-;;;6666;;Oweoe)`Y)^D3oO%OOoooOOOOoooooooooooooooOooooooooooooOOOOoOOooOOoOOOOOOOOOOOOOOOOOOOOOOOOOOooOOOOOOOOO%%%--;;--;;66>>>68w8w6;6;6y66668w8>;;-;6utxxrrxZZxxZAnxZt;8tw6;>ww6%;tnVVnnVxt8;--->;;>8w8>w>;->>>>>6w8>-%->=&&&;-;rtlvvlll779rllrr66668wwrxtvnZZxxntrxxrwr>=OooOOOooooooooOOoOOO%&>=>uw&O%7rtxxxcNxxxxxxxxcccccccccccccccccccccccccccccNNNmmmmmmmmcccccvvlxxxzrr76-%%-:6qq>&OOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOO&dD=o3Eefee=&&=&O=ud342L4==3=OoOOOOOOOOOOO%%OOOOOooooooooooooooooooOOOOOOOOOOOOOOOOooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOOO%==&&&;;;---&%%OOOO%%&;;;>>;;;;&&;;---%%%:**%OO**%******%**%%%**********%%%%%%%%%-----%%%%%%%%%%%------%%-------%%%%--------%%%%%%%%%%%------%%%%%%%%%%%%%%%%%%%%%%%%%%%%--%%%-----------%-;-%-wxu>%%%%%:%%%%%***--;;---------------;>>-%;-----%%%%%%%%%%********&&&*%%OOOOOOOOOOooooooooOOOOOOOOOOOOOOOOoooooooo@ooooOOOO-rxNccN",
+"ZrvZZZZvZNccNx07%%%-;>>6uw>>>>&%OOoOOOOOOOOOOO%%O%&&>>>&&&&&&&;;;-->>--;%%%---;;&wyweSLS^^L=&=%>O%=%O@3e@@OoooooOOOOOOOOOOOOOOOO&OoOOooOOOOOOOOO%%%&&&%%OOOOO%%%ooOOOoooOoooOOOOOO%=33>&-6w8899666666666>66886>;>wwww>;w>6;-->>;-xAZxZZxZxxxvw>;ww8>6ww>86>wnAZnxnVVnyw6-;;-->>->-%--%%%---;6w6>OO&>&%>ttw69vccc9;-7979lr766896-t6;8nAnrZxxxxr68w=OO%OOooooooooooooO=33>3%=;>3;,;0txxxxcxxxxxxxxccccccccccccccccccccccccxxxcccccZmcccccccccxxvlrrrrrrrtt6>-%%%%%OOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@o@+oooo@o..o+@o@d24oFw3CDeC^3=+CDO3>OVd=ULeedY3OO=oO&oO%OOoooO%%OOOOOOOOOOOOOOOOOOOoooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO*%OOOO%&OOOOOOOOOOOOOOOO&=;>>>;-%-%%&>=&oO*&&--;-;66>-%%%------:%%*>11*O%%%%%%**%%%%************%%%%%%%%;---------%%%%%%------%%%%%%%%%%%--;;----%%%%%%%--------%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%-----::------%%----%%wyw%%*%%>%:,*O%*:::---%%-----::>%---------------**%%%%**:*******%%&&&%%%OOO%%%OOooooOOOOOOOOOOOOOOOO%OOoOOOOOOOOooooooOO*:wxNxxc",
+"AxttrvnxzzxNNx07%%%%%%&&&%OOOOOOoOOOOOOOOOOOOOOOZu-%%68866666666t866>;;66>>>>>>>>&==OO+Oo==Oey>>=>>=OO=3=+++@@@@%%%%OOOOOOOOOOOOoooOO&OoOOOO%%%%&&&;;;&&%%%%%%%%OO======+OoOOoooooO=3uuuwtyrrr968886666666666>;;-;-;w6;6uww888ww;tnnnZZZ88wtvr86-6wwww6-;8tt86wynnnnnnxxnytyu>-;>;-;;%%-O%%;>>-%OO%&%%-w66;;799lvr9r9999999rrrr968tvvvxnxvvcnxvxw>&%OOOOOoooooooOooO%=>3uw=&&&;&-7rxxxxNxxxxxxxxccccccccccccccccccccccccxxxccccccccccmccmmmmccxxrttttyyyytw>>:*%OOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@o@+oooooo@+@oooo@..5(^FdLLYFSDF@FY3=ode3o>edV3>@<33d/3O3Ao>O=o@oo==OOO%OOOOOOOOOOOOOOOOOOOOOOOO%OOOOOOOOOO%%OOOOOOOOOOOOOOoooooOOOOOOOOOOOOO%&=OOOOO*OOOOOOOOOO>>>;&-%%---%%&*OoO=>>>>6666>;-%%-----%-%%%%***@O%%%%%%********::*****:::::******;;---------%%%%%----%%%%%%%%%%%%-------%---%%%%%--------%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%-----;;;::-------:::----:u,%%*%**%***ww*--------------------------------***%%***::******%****%%%*%%OOO%%oooooOOOoOOOO%%OOOO&=>==&&&&&&%O@@@OOOO%qwyZZNNZ",
+"yZZxZZxzxxxcNczr>&OOOOOOOOOOOOOooOOOooOOOOOOOO%%;-;6rr6;66666666>>>>>>>w86>>>>>>>&>w>=2=3e3O=&O&>>>=&==>=====+++;----%%%%%%%%%%%&>>=3yu*&&&&====&;>>>>>>&&&&&&;>&&===>333>===OOOOOoO%&>>>8868rrrww86>>>>86>>;;;;uw;>ww--;-->>>wyrrttxxtr;;6ww6;;tyxttttu%6t8%%%6xxytynZZZxxAn>-8>>>w6>>wO%%%%%%%%O%&%O%;>66;-;6979976777;9llr9rt-6rtttxZnxxnnxxcuw>>%OOOOoooooooOOooOO=3>u%%%%u3-;rtzxxNxxxxxxxxccccccccccccccccccccccccxxxccccccccmZZmmcccnnnZcVVVxxxyyuw,>*%OOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo+@ooofs.@CEESUEDCLLSeew>e3O=do>OYF=O%,%>@2O3=^T^^%=dD=af<oooO%OO%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&==%OOOOOOOOOOOOOOooooOOOOOOOOOOOOO%&=&O%>;O%3OOOOOOOO==&&%%%%---%%&OOoo+=&&-;6;---&&&-:----%%>**%%***%%%%%%**%%%%%%%%---;;;>>;;;;;>>>;;;----;---------%%%%%%%%%%%%%%%---%%%%%----------------%%%%%%%%%%%%%%%%%%%%%%%%--------;;;;;;;>:::-----%---%%-:%>;%-;-;%;;%-yy%-----------%%%%%---%---:--------**********************%%::*%%%*>&&&&&&&&&;;&%&%%OOO%&=>===>>>==&++=+&***>,uyxtrt",
+">AZyZAVVZxztzxxxu>%OO%OOOOOOO+@OoOOooOOoOOOO%%&&6666-%%;-;;;6666-->>86>>>>>>>>>6>ww>&33O3w>>w>>u;&&>>>>>========>>;;;;;;--%%%%--&&%%>w,&&&&;;;>>;;;;;;;;>>>>>>>>&&;;;>3wuw,ww>>,&*OOOO%%%%%%;6ww>>>>>>>>>>>;;;;;tw>>uw>>-%%>;%>yx86rtr6>66666;;6yyt8>;66;>>>;---tww8wtxVnynZx>-6;>wuwwwy>%%O%-%%&%&>>%O%>;;;-->6%66;;666;6rr6;;6;--6rvvrxxZZZcxxytuw>%OOOoooooooOOOooO&>OuOO%%Vu-;rrzzxxxxxxxxxxccccccccccccccccccccccccxxxcccccxcmZmnnnccZZVVVVVVyyuww3&*OOOOooOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooO@oooooo2s<fK@=d^)EaSLf43=3=O>OC4OO=eOO>3>VV;O33O=OO&y3wo=d^{Eo+233=%O%%%OOOOOOOooOOOOOOOOOOOOOOOOOOO%O%&>;&%OOOOOOOOOOOOOOOOOOOOO%%%OOOOO%%&&>&&>&OO&%%%%%%%%OO%%%------%%&OO@@@OO%%---%%-&;=:---:-%%>:*%%****%%%%%**%%%%%OOO%---;;>>--;;;;;;>;;;;;;;;;;;;---%%%%%%%%%%%%%%%%--%%%%%%%%%%------------%%%%%%%%%%%%%%%%%%%%%%%%--------;;;;>>>>:::-----%%%%%---O;-%-;-;;>>%-ttO----------%%%%----%%%--:--------------------------------->ww6>;>>>>>>>>>>>>>>>>-%OOOO%%%;>>>>;&&&&&*****%%*>>:*:",
+";yw%>uyVNxttttttyw&OOOOOOOoOOOOoOOOoO=&O&&&&&&;;6666868t88888888www6>>>;>>>>>>>6;;6;%,u>dyuww%%%>>>>>>&%;;&==&&&;;;;>>>>>>;--;>>&%%,>%%;&&&&&&;;;;------;;--;;>>>>;;-;>ww>>>8>>6>>>>>,www>%%%-;;---;;;>>%--;;;;;%-%-ww6uxuuyu>8nx86rxxrr866668xA8wyyw>--w868ww86886>>6wtxZZxt6;-->www>>ww>-;ww>%%%>uw&%%-%%%%---;88;;66->6686;-%r;%%6r6;;8tcncxxywwuu>%OOOooooooOOOOOOO&Ou%&%Oy;-7rzzzxxxxxxxxxxccccccccccccccccccccccccxxxccccccmZnxxxxxxxxxxyy33>=&OOOOoooooooOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo+=oooo5hY^f2(^dSLfLe4=d3==3&o==CC3O>3=&O=>%FUuO=%>y%yOO>3of^Y@=@o@=>;%%%%%%OOO%OOOOOOOOOOOOOOOOOOOOOO%O%%%%%%O%%%%%%%%%OOOOOOO%%O%%%%%OO%%%%%&%&&O&uw&&&&&&&&%OOO%%--;---%&&&O$+@oO%-;%%%%%&*O*%%%**%%**%%%OOO**%%%%%*:***%%%%%%%--;;;----;;;;>>;;;;;;;;;;;;--%%%%%%%%%%%%%%%%-%%%%%%%%%%%%%----------%%%%%%%%%%%%%%%%----------------;;;;;;>>:::::***:*%*::*%%;-%;;-->;>;->>%**%%%%%%%%%%**::**%%%*::::::::::::::::::********------;;-6utw>>>;;;;;;;;%;>;>686>>&&%%&&;;>;;&&%%%&&&***%%*:*%%%",
+"O>&O%:>,uuyNNxtre3&OOOOOOOooooooOOOO=33&>>>;;;;>t;-wnnt8ttuww866ww>%%>wwwww86>>>x66nyuVAyw>--;rv;;;>>>>;>;;;;;;;%%%&&&&;>>;&&;>>>;wZV>%8----;;;;>;;;-;;;;----;;>>>>;-;>68>;>>;;;&>>,,,wwu>%%OOO%%%%--;;;%%%--;;-%-%->>>uyyyxyuyVZtrxZnxx666>;>tAuutytwww>6ww868w8886;>8twyyw8w8--;>8>%%%8>wyVVw%%%>yu>&>%%O%%&;&>>>>>ww>6668ww6;r8;-----%-8rw966w66uyw&OOOooooooOOOOOOO%%w&;;%w%60zxxxxcxxxxxxxxccccccccccccccccccccccccxxxccccccncxrwwwwwwww>>>OOOOooooooooooooOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOooooo2FD@)hoSaS(U^UddS3=o=OoOweCC=3FyOo>33>>>AD%w>u%O;&%,&2o2.Kh5<@O@=&%&%%%%%%%=%OOOOOOOOOOOO%*>&&%OOOOOOOOOO%%----%%%%%%%%%%OO%%%%&&&%%%%%%%%%OO&>&%&w;;;&&&&&%%%%%%-----%&;=%#+@oO%&;---%%OOO%%OO%%%O%%**%%%%**%%%%%%***%%%%%%%%---;;;;;;;;;;>;;;;;;;;;;>;;---%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%--------%%%%%%%%------------------------;;;;;;;;:::******%%%%%%O%;-%>;%-;%;6-%;>***%%%%%%%%%*:::%%%%%%**********::::::::****::::::---:::>>q6>:>>&&&&&&;;ww8>;66;>>>>>>>6>>>;;-------;---:**:*%%*",
+"OO=3>&*O:>wuyyyyyw>%OOOOOOOoooooOOOO&33*;&;;>>>>Di&%%%&>ww,>>>>;&;&%&,uuwww>>>>>ArrZt;>w>;>>-;;%%-;;6>66;>>>>;;;***&&&==========-%;uw-%-------;;>;;---;;;;;;;;;>>66;;;>686;66;;;&;>;&&&&w&OOOOO%%%%%&&&&%%%%%%&&>>&&>&%>&;>,wwuuttrttrww6886-%;rw>--;;>8-;>6>>688w86>6tx8>;>8ww8>>6w8-%%>wyVZVt8>wuyu>>w&&&===>3>%O&>w,,88wwuuuwrrr66;;;-8rr6666uwwuu>%OOOooooooOOOO%%%O%&-;>>>--7rzxxxcxxxxxxxxccccccccccccccccccccccccxxxcccccncxr6--;-%%%%OOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOO=oo@=fLY4Ca$pJS+wC=3eF33dTFeO33=O=dF3%AwO>OOw>&%OOw>%%>wOO4+#`^saSLD3OO,&&&&&&&&>&OOOOOOOOOOO%&=>>&%%OOOOOOO%%&&>>;;----&&&&&&&&&&%&&&&&%%&&&%%%>;>>;%%%>>>>>>>>=&&%%%----%%%&=*X..ooO%-%--%OO%=:*OO%%%%%***%%*:**%%%%%%%%%%%%%%%-------;;;;;;;;;;;;--;;-;;>;;------%%%%%%%%%%%%%%%%----%%%%%%%%--------%%%%%%%%------------------------;;;;;>>>:::*****%%%%O%:q-;%%;;%;;%;>-%;>****%%%%%%%%%**:%%%%%***********--::::------:::::::-:::>6>:::::>;;>>>>>;xxt6>>;-;>>>;;;>>;---------;-----%%*%%%*",
+"=O*3**>%%%%%:quNie3=OoOOoooooooooOOoO&&O%%%&>wwu;&>w>%&w&&&&&;>>&>w,wuuw;&&&&&;>7-66668>>;66;79;;666;------;;;;;========%&&&&&&%;-%%----------;;;;--------------;;;;;;;66;-;6;;;>>>>;;>wy>%%%OO%&&&&&&%%%%%OO%%&>;%%>&%>&>>&&>&%%-;;;>6668tr6%-66;;ww6--;-%;wtuw886>>8xAn6-8w6>wwwwyyw>>8uyxyyyxVVVVu&>w&>3>=&>3y>%;,>&&>,wwwwwutr9rttw6rxZnxnZZnxyyw%OOOOoooooo%OOO%%%%>%;;>>%-%-7rrtzxxxxxxxxxccccccccccccccccccccccccxxxcccccZxt6%%O%%%%%OOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOoo@222@o+.$2ss@fw3eew==&3TFDFDd=3OoFSdEV==wFwO,>->%%t6TyV=+.2SK))Yd@O==%&&&&&&==3=OOOOOOOOOOO%=>>&&%OOO%O%%&&>>>666>;---&&&&&===&&&&&;&&%%&&&&&&Ou>OA)^w>>>>>>>>==&&%--;--%OO%&%  ..O%%%%%-%OO=ew>*%*:**%%%%OO%***%%%%%%%%***:::--------;;;;----;;;----;-;;>;;-%------%%%%%%%%%%%%%----------%%%--------%%%%%%%%----------------;;;;;;;;;;;>>>>>::******O*>*%:yA--%%;;%;>-;>%-;-*****:::*%%%%%%%%%%****%********--::::-----::::::::-::>>6>::>>::;;;;;;;;ww6;;666;;>;---;;;-%%%%%%%------%%%%%O%*",
+"%>>%%>>%;>>;%%>txtrw6-%%%%OOOooOOOOOOOOOOOOO%%&&%wO&uOOu%&&>>;-%w>>>>-->;>6>>6>;w>&>,,>6w-%66-;9>>>>----;;-----------;;;;----;>>>>--%---%%%%%%%%;-%%%%%%--%--;;-&&&&&&====%&&&&%;>>>>>>>>>>;----%-;;>;;->>>;---%;;--;;>>w86>>68wwwwww6>>wwww86>>uw6>6666>68w8668>>>>>>>ww,&%%>w,%&>wwwuu%;wyyyyitxxyw>==O=wuwwuy>>>>>>&&%&>w,>>>wuyyiVu>;>8rttvxVZnyywOOOOooooooOoooooO33ww8977vw;;rxxxnxcccccccccccccccccccccxxxxxxxxxxxxzzzzxxe3+OOOOoOOOOOOOOooooOOOOO%OO=oo@ooOOOOoo<ooo+o@o%%%&%OO&%%OOOOOOooooooooooooooooooooooooooooooooooooooooOOOOO%%%OOOOOOOOOOO%%-%%&o3+oo@oD_d^/AnrrD;ny>;=oOLYe2e5D2CLD244@43TD3oeCO==O=Dy=OOD)OyF33O%>%>%%%&-----&&&;&%OO%OO%&==>;%%%%%OO%%**&:>>>:*:*%%*:::::***%q>%:>:>*********>%%ATUu*&%*w>%%----%%%%O>1OO=OoOOOO**%O*%*&O&OVV>O%&*%%%>>%O*&%***%%%%*%**%%%*%-%%%%------::::::::::::::::-------%%%%-------%%%-------%*OOOO==o%%%%%%%%%%%%%%%%%%**********%%%%%%%-----;;;>>;;;;;;----------;>>%-;;;;-%;;;;;;;;:::--::::::::--%%%%-----%%----;;;;;;;;;;;;;;;;;;;;;;;;;;;;;>>;;;;;;;;;;;>>>;;;;;::::------------***%%%%*%OO*:**:",
+"%>>OO%>>&-;;--6y6--;;--;OOOOOoOOOOOOOOOOOOOOOOOO3DVO%ww%>>>>>>>>>--;;--;->>>>>>->&,yy>>68>-%;66%-;>>>>>6;;;-----------;;;----;>>;;-%%%%---------%--;;-%O-%%-----&&&&*%@@OOO%&&&&;;;;>>>>>>>>;;;;>>>>>>>>>>>;----;;--;>>>>>>666668wwwwwwwwww8>>>>w6>;>66>6686>;;;>&&>>>>>;,w>>>>>&&&&&&%%O&wyyyuwwtyyw>>>&&>uVVt6O%>www>&&>>>>>>>>>>>uyyuw866wrttuxyyVu%OOOooooooooo@@@=d=>>6w79cw;;rxxxZxcccccccccccccccccccccccxxxcccxxxxxxxxyy3=OoOOOoOOOOOOOOooooOOOOO&%ooO++OOOooO@=o@2+Oo@o;%OOO%%OOOOOOOOOoooooooooooooooooooooooooooooooooooooooOOOOOO%%%OOOOOOOO%OO%--%%Oo=o@=fYFDdTFwAuvrtrO%OeLoLY+Uo5f@fFYo23fo=o3EU+=Deo3=d==3&DT&*%=w&&%O>%&&&&&;;;&&;>&%O%OOOOO%&=>---%%%%********:**::**:****:>>,*:%O:1:>******::O:,%%>>*Owyuw**w----%%%%*OoOOoo=***%%%%%*%%*O*%>w%O%*%O%%O%%*%%%***%%%%*%**%*::*--%%------:::::::::::::::::----------------------------%O%=&OoO=%%%%%%%%%%%%%%%%%%***********>>w%%------;;;;;;;;;;;-------%%--;;-;;>>;;-;;;;;;;;:::----->>>>>::----------;>;--;>;;;;;;;;;;;;;;;;;;;;;;;;;;;>>;;;;;;;;;;;>>>;;;;;>>>:::----------*********%*:>::>",
+"&ww>%&,w&%-;-->w6;-;6;-&%%OOOOOOOOOOOOOOOOOOOOOO%d=O%%%%>>&--;>>>----%%-->;--;>-&&,yu&%>%>w6;;;->>6>>>>>-;;;;---;;;;----;-----;;---%%%%%--------;;-%--;>%%%-----%%%%%OOOOOOO%&&%----;;;;>>>>>>>>>>>>>>>>;;;;;---;;;;;>>>-;>>86>>>6688wwww86>>>>>6>;;;>>>>666;;;;,;&>>>>>&,ww>;&&&%%%&;&&>wuuu>;&;>6>&%%%%&,yVVw;>>>>,wuy,>>>>>>>&&%&wyyyuw8wrtrr>wuyVy;%OOooooooOoo@oo@3%&--;--76--wttvcxccccccccccccccccccxxxxxxxxxxxxxxxxxtuq6@OooOOOoOOOOOOOOooooOOOO>OO>=oooooOOOOoo=ooO=@OOO%;%O%&%OO%%OOOOoooooooooooooooooooooooooooooooooooooooOOOOOO%%%OOOOOOOO%%%%%%%%o&=ooo2TTDeuw>>wt%;>O>*eUo+e@2+++<+YL2o2^^eo4SU=eA=oe==%O=Ow33%OOw>&OO&%&&&&&&&&%%&&%OO%O%%OO%*O>>>>-%%:::&***%%%%%:::*:>>:***::%:*:uu:%****::::>>,3:%%>>O%D^^VO----%%%%&Oo*Ooo=%*>&%O%****%O%wO%O%*%OO**O%>,*%>***%%%%*%%%%%**%--%%----::::::--:::::::::::-------------:::------------%%*Oo==3C%%%%%%%%%%%%%%%%%%********%%*>ww%-------;;;;;;;;;;;;;---------;;;;>>>>;;;;>>>>;;>:::::::::>>>>::----;;;;;;>;---;;;;;;;;;;;;;;;;;;;;;;;;;;;;>>;;;;;;;;;;;>>>;;;;;>>>>::::--------::******%%%*:::>",
+"%3euww>>&%%---%-r6;66>;&>>=%OOooOOOOO%%*O%*&&%OOOOO>uO%w;&%%%%-->>;--%%%>>>-->>>&>>>&&&>;&%-%%;w888>>;;;-;>>>;-%;;;;----;-------%----%%%-------->;-%%%--%---%%--%%%%%OOOOOOO%%%%%%%----->>>>>>>>>>>>>>;;;;;;;;;;;;;;>>>>;;>>>>>>886>>>>>>>>>>>>>6>;;;;;;-;>>;;>6w>&>w,>>>>>&%%&&&&%&>w>;uww>%%%%%%%OOOOOO>ydu>>6uw6>>wuyw>>>>>>-&%%>uyuw>8tyxtrw>uyVAy>%OOooooooOOoooooO=ww8r7;76>>wttzxxcccccccccccccccxxxxxcccxxccxxxxytuw>*%OoooooOooooooooooooooOOOOO%OooSJ=OOOOOOoooeF*O%y3%>w>-%%OOOOOOooooooooooooooooooooooooooooooooooooooooooOOOOOO%%%OOOOOOOO%%OOO%%%oO=ddSfUEJd3>wO>xwwu&&=o3=f4+...L44^2o4CYJ322d+d3oTD=Oo3==O>OAdw==&OooO%%%%%%%&&%OO%OO%&%>=O*33%;>>>;-*>::&***%%%%%::*%*>>:******>:>uu:%****::::w%O*3>::&:OO%*%>--%%%%%%O%**OOOOOO*&*%%%&&&OO*AO%%*:*OO*OO%%%OO****%%%%*%**%%%%%-------::::::---:::::::::::-------::::--::-------------*O>==3=eU********%%%%**%%%%*****%:*%%%**:--------;;;;;;;;;;;;;;;;;;;;;;;>;;>>>>;;;>>>>>>;>>;;>>>>--;;;;;;;;;;;;;>;;;;>>;-;;;;;;;;;;;;;;;;--;;;;>>;;;>>;;;>>>>>>>>>>>;;;;;>>::::::::::::::::******%%%%****",
+"O&=>>>&O&%%-;-%-;--;>>>>>>=*OOooOOO%*=>>*&=>>==&O3=>,>w&;;;>;---;;;----->>>-->>>>w>O%ww&>>>>wu,&-;>>>>>>;;>>>;-%>>;;;------------------%---------;>>;%%O%---%%%---%%%%OOOOOO%%%%%%%%-----;;;>>>>>>8ww>>---;;;;;;;;;>>>>>>>>;>>>686>>>>>>;;;>>>>>66>>;----;;;;;>6w>&>,>>>w&%%%&&%&&&&>>%O&%%OOO%&--%OOO=>&wdy;%-8->www>-->>>>>>-%%OO&>w>>-6tytwwuuyyyVu*OOooooooooooooo@=O>wwxt9rrrrtxxxnxcccccccccccccccxxxccnnnVVxxyytuw>:*OOOOooooooooooooooooooooOOOOO%>%eLJo3=@oO=eVy3DAU>yytw>-6w;OOooooooOooooooooooooooooooooooooooooooooooooooOOOOOOOO%%OOOOOOOOOOOOOOOO&OeDLELfd=CLO>u&&&DwO3=3=C4SSWYLgYP5`_^5ooeSo@+2SOEDo===w&ww&Vy&3OooOooOOOOOOO%%&OO%%&;>>3>=3ye>-;;;;::**********%*>>***%%**::::::%O:::,***:::::**&*%O%::>**>*OO%%%%%%%%O*&*O**O:*%***%%OO**wATD>*%*%%%%>uu&O%&****%%%%**,w>%%*:-------::::::---:::::::::::-------::::--------%%-------**OOeTL&o********%%%****%%*****%%****%%%%--------;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;>>>>>>;>>>;;;>>;;;;;;>>;;;>>>>>>;;6ut6-;;;;;;;;;;;;;;;;;;;;;;;;;;;>>;;;>>>>>>>>>>>;;;;;::::::::::::::::::******>>:*****",
+"*OOOO%%O%%%&>>>>-%->>;&&%%OOOOOOOOO%&=>3&&=>>>==>u=%%;w%&&>>>;%%%--%%;>;>>>-->>>%>>O%wwOO3wOoO=%;;>;;-;>>>>>>;-%;;;;;;;;--------;;-------------->;-%->tV--;;%%-;;-&%%%OOOOOO%&-%%%%%--------;;;;-;>86>;-;;;;;;;;;;>>>>>>8>>;>>ww>>>>>>>>-;;;>>>>>66>;;;;;;;;---;w>;>>>&;;%%>w3&%%%%&&&%OO%%&%%%%--%%&>wewuw,&->6;688>---;;>>6>;-&OOOO%&>>www>6wyyVywu>OOOooooooooooooo@+o=>>ww66wrtxxxxxxcccccccccccccccnncxxxxxwwww,>>>*%OOoOOOooooooooooooooooooooOOOO=O=CC=oo====>eCFGO;yTytwxt66wyVVe=OoOoooooooooooooooooooooooooooooooooooooooooOOOOOOOOO%OOOOOOOOOOOOooOOO=FF3fd@o+eD&>w&ODOeeoYe2+5LS^`W.f55oTYS2ooaS+DCD=+O=+&oe%>&O&&O4@@OOOoOooOOOOOOOOO%&*&===&&>uw&-;;-:>:*%%*******%*>>>>>********%*%:w>*>::::::::*,w>%*>>%*OO&:*>%%%%%%%%=OO**O*3Vu>%%***>*%OOO,O&%OO%%%%uAV>%>>****%%%%**,w>%%*:------::::::::--:::::::::::------------------%%%-------*,3%O&OOe********%%%***********%%%%*::*%%-------;;;;>>;;;>>>;;;;;--;;;;--;;;;;;;;;;>>>>;;>>>;---->>>>>>>>;;>>>>>>>--6ut6-;;;;;;;;;;;;;;;;;;;;;;;;;;;>>;;;>>>>>>>>>>>;;;;;::::::::::::::::********%%%%*:>>",
+"&OOOOO%%OO%&&&;>>>ww6%%%OOOOOOOOOOOO%&=>========e3%>>&ww%&&;;-%%->>--;>--;;%%;;-%%%%&;&*&&>3=O+4>>>>-%%%>>>>;---;;;;;;;>---;;;;;;;----;;;;;;;;;;>;%%%8VF-;>>-%-;>;%%%O%OOOO%%&--%%----;;----;;;;--;;>;;-;;;;;;;;-;>>>>>>>>>>>wuuww6>>>>6>>>>>>>>->>>;;>>>>>>>>>>w3>,>>>>%O&wyw>&%%%%&&&;&&&&%%%%%%%&>>333>=&;>>8tw8;%%;8;>66>>66>&OOOO%>w,>>>wyyyy>&=*OOOooooooooooooooo=3>;ww66;6rtxxxvxcccccccccccccccZZxvtw86%%%%OOOOOOoooOOOooooooooooooooooooooOOOOO&Ooo=4fo+3eeeyy>yV%>xZ6ttyywuAUSe+@@ooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOoo@+O3Se<2342ee333O3LeF@dD4fds+@)^ X5.o#2..L[L5oDfo+o=33eoo3e3&>%&ww=3d=o=oOooOOOOOOoO=3=%O&OO%*&&&&->w>*::*%%*******%*:>:>>3>:*%%**:::qyw*%>:::::**%OOO*>:*ww**,>OO%%%%%%%%&*%%%*>wyw>%%%**%O:yVFuw%%%O%%*%>w>OO%%O***%%%%**::*%**%*******:******:::::::::::::---------------------------**OO*>>*Oo********%%************%%%%******------;;>>>>>>>>>>>>>:::***::***;;;;;;;;;;;;;;;;>>;;;;;>>>>>>>>>::>>>>>>***:>>:%;;;;;;;;;;;;;;;;>>;;;;--;;;>>;;;>>>>>>>>>>>;;;;;::::::::::::::::********%**%%:>:",
+"OOOOOOO%OOO%%O%&;>wu>%O%%OOOOOOOOOOOOO%&>>>==&&&>=O;&O;O&&&;--%%www>-;;%%--%%--%>%%;&O&u3OS_]/4o-;;;;;>>>>>;-----;;;;>>>---;;>>>;;----;>>>>>>>>>%->>;--;->>>-%->>;%OOO%*&*%%&--%----;;;;;;;;;;;;>>>>>>>8;;;;;----;>>>>>>;;>6wutyyuw8>>>>>>>>;;--%->>;;>>68888wwuuwwww>>wOO&wuw,3,>&%OO%&OOOOOO%&%%%&>=&OO%==&&6w8ww6-%%->66>;>wtw,>>&%%>w>&>yVVyu3OOOOO%oooooooooooooooooOOO&>6w-6rxcncxxcccccccccccccccZxtw>;%%oOOOOOooooooooooooooooooooooooooooooOOOOOOO3d3=d<3eew33,w>;Att6ZnttnywyFA3ooooooOOoooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOo@+<Cdd=SC2=3oDe==eeCe52SfCSfYL`Y $..5+..YfL]^Df+@d4fSY@o3dLO3Oe>>>>@dJ4o=OoOOOOOOOOo=dde&O>%&=>&%%>:wuw**&:********&&%&&%%&,>&%%;,wVuOO::%:>>>::****OO*&%%:O&:**O%>%%%%%%%%Owu%%uu*O%**%%%**O3FDD%*%***%%%%>*%*>>>****%%%%*::*%:,>%*******:*****::::::::::::::-------%%%%--:::-------**--**>**%O&>%********%%************%%***%%%**-----;;;>>>>>>>>>>>>>:::::>>>>:*;;;;;;;;;;;;;;;;;;>>6wwu>>;;;;>>:::>>>>>:>>>**:>;;;;;;;;;;;;;;;;>>>;;---;;;>>;;;>>>>>>>>>>>;;;;;::::::::::::::::***%%%%*iiu>%%OO",
+"OOOOOOOOOOOO%%%%&;uywOO%OOOOOOOOOOOOOOOOuUyO&*O&==&%OO%;&&&-----;>8;%%--%--%%-;-%-&&&%,Fd==edTS+;>O%;%%%>>>www>;-%>w>%%-%>>-%-;--%>>-->%;>>>>;--;;;;;;;;%%%%%%----%%%%*&**&&&---;---%%%>66---%>>;;;>>>>6>>---;>>>>>>>>>6>>wuttuuuww>8w>%>>>>>wyV;;>>>>68>ww6>6ww33ww3>&%O%>333>=&&=>ww>&OOOOOOO%%&&%=33=O%%*&&&-;;;>>6886w6;888tyuuuw>&O%,yVdyuu&OOOooOoooooooooooooooooo=oOyu%-;;6zcxxZxccccmmmccNNNNNNVxxVu%O%OooooooooooooooooooooooooooooooooooOOOOOO>Oo=@oooYdOe=>3wwwrttttxxyxiy3&OoooooooOOOOOOOOo@ooooooooooooooooooooooOOOOOOOOOOOOOOO%%o%OO%%O&oO=o+2oUSYL=@34fo=+d=3Y22@ofLof+oSYP$ X$..ohEJL4f2sY@fELdo@eeC^&=&C>&;O+4Le+oo=OOOOO&=3o=T{Yo33>OO3&%&%*%*>:%%*%*O=Oo1O>O%&O%3w3O%>Fd>=O%wAV*O>>:%%:>*%*%%****:*OO%*****&>>>&%%%yy*%ww*:%O>%>%O%%%%OOOO%******%>&*%%%**************************:::::***:::-----::::>>:---------%%%%%%%-%*:::*%%*%%%%%*&&*O%>*O=**&&*****:::*%%%%*%%**%*->;->>;;%-;>;;;>,%>>>w,>w>>:*::>>>;;6>;>;;;;;;;;;>>;->yA>;>uu>;>w>>>,>O::**>>%%%----;----;;;--;>;;;;;;;-;;;;;;;;>>>>>>>>>>>>>;;;::::::::::::::::********w3=*OOOO",
+"OOOOOOOOOOOOO%%%%%>3>OO%OOOOOOOOOOOOOOOOOy=O*%O%OOOOOO%&&&&------;>%%%%%%--%-;>;6>&&;&>VyOOoo2ooVFt;--w8>>>wuuww>>6ww-->-;;-;>;%-%;;%%-%;;>>>;;---------%%%%%%--;;;;&&==**&&-----;;;-->>;-%;8>>-;;;;;;;>>>;-;>>>>>>>>>>6;>wwutttww8>8w>->>;;>>wt&&;>>>>>wwwww,>>&====*OO%&>3wwww3>>>333===%OOOOOO%%O%>==OOOOOO%%>>>>6www>>>>yywwyw>wyyw%O&>,>&&&%OOOooooooooooooooooooooo+@=Vy&>;;6rzxxZxccccmmmNNNccxxxVyyyw%O%oooooooooooooooooooooooooooooooooooOOOOOO%OOOo<TU`)LDTT&uuyyvttrww>,3>&OOoooooooOOOOOOOOOOooooooooooooooooooooooOOOOOOOOOOOOOOOOooooO*%OOOo@=5.gEe4eo=3O=o3@@SY=5L@+h54ST4SS  #  #5EfYEhSSf4+$YEY2+4F+3=@OFF%3OVaDe@4eOooo=ee=O%4ooCe3C33uu%OVFw>:*&&*%*===>OO>=OO%>=&=&O&&>3>=3%%>w>%*>>:*:>>>****>>%%*uw>&*%OO=%*uCAe*O3w%O>>%O>wD>>Ou>>*%%%%*%******%ww,>&***************************:::*****:::-----::-::::---------%%%%%%%%******%%%%%&&&&&O==OO*=*%******&%%*::*%%%w,>uu>O>w;%%-%%>>66>;;>>*%%%O>%*&>>>>>:;>;;6>-;>>>>>>>>>>>>--8u>;>ww>;>&:>*>3%,>>&&***&;;;;;;;->>;;>>>;:::>::**>::::::>;;;;;;;;>>>>;;;;::::::::::::::::====&&&&=*%OOOOO",
+"OOOOOOOOOOOOOOOOOOO%OOO*OOOOOOOOOOOOOOOOO=OO%OOOOOOOO%%&&&&-----%--%%%%%-;-%%;;-&&%&>>>uA>33=&=ewAy;%%-O-%%-;>;;>;>8>%->;--->6;%;--;------;;;;;;----------%%%---;;;-&&&&*&&&----%;>-%;>-%->;%%%%;;---;;>>>>>>>>>>>>>>>68>6wwuuuwww6>8w6;>>>>6www>>>>>,,,w>>ww>&%OOOOOOOO=&&>3ueu>=&&=>=&>>=%OOOOO%OOO&=OOoooOOO%%%%&;>,w>>&,Vi,&ywwuVVw;%%%OOOOOOOOooooOooooooooooooooooo@oo>3=ur66rzxZZxcccccmmccNNNcxxxuuu>OoOoooooooooooooooooooooooooooooooooooOOOOO%OO&=o=US33LD=yywuutuw6>;&%OOOOoOoooooooOOOOOOOOOoooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%@@@@OOO&*dOde5SP_Co+3@o323@DY4fa$@s+oo=Y^`^.$# XP_RKKPLESfSsLYg@s+Ss+oo4=OVd&wOy4Ed+==O=2=eFFw=3o5e@@o==%=3>>iV>>>*%*:&%=oOOO=Oo3&&=OOOOUU33&=OO%**%%*>>***:::***%*:*%O%3w>%%:&%Dd*O>3>OO*:%O%*%O>uU>>Oiw,>*%**&%******%w3>&*%%%***********************::::*****:::---------::-------------%%%%%%%****%%%%*&;&&&*OO>>>>O%%*****=**%*::*%%uw>uVwOxVu>66>w6ww6>;;;*>>>wOw*%*>>>::>;6>;6>;>>>>>>>>>>>>>&&&;>;;88;;>*>w%*3%>>>>>>>>>;;;;;;;;>;-;>>>;>>>>>:::>::**::>;;;;;;;;>>>>;;;;::::::::::::::::=====&&&%%%OOOOO",
+"OOOOOOOOOOOOOOOO%OOOOOO&OOOOOOOOOOOOOOOO%&O&OO%OOO%&&&&&&&&------;-%-;;--;-%%%%%%&&>w>%;,O%%u&>>%yw>>;>%uw8>>;;;---;-%%;;--->>;%--%->;->----;;;;----------------;;--%%&&&&&&--;;%>>%%>>%>>6-%;->;;;;;>>>>>>>66>>>>>>>>88wwwwww6>>6>>6ww>w6>>www8>>>>>>>>&>>>>,&OOOOOOOOO&OO%>333OOOOOOOO&=&OOOO%O%%OoOOoOOOOOO%%OOO%%&;>ww>,yu&O>wwuwwww>&OOOOOOooooooooooooooooooooooooo@oooOO3trwrxcnnccccccccccNNZZNNtww>&OoOoooooooooooooooooooooooooooooooooooOOOOOOOOo=OooOoO=O=V%=>>>&%%OOOoooOOoooooooooOOOOOOOOOoO+ooooOOOOOOOOOOOOOOOOOOOOOOOOOOOO%*%Oooo@=OOOFF@S)_`E4Sd<LTFdD^SSd.SfI$@S^EYC=e+..X sY#sPs 5pg2pfS)44p.LD+Y@@33%3,&>&oD=o=3==3==33%&,+4F4322COoO>>>%O*>:%%==*3=i3=3O@>OO==3yi_^=OO=e>%&&&&;;&;>>&%%%&&****%:3%>:O%3w>>==**%OO%%***%%:***A%&Ow>>*%%%**%******%**%%%%%%**********************:::::*****:::---------::-%------------%%%%%%%**%%%%%%&&;;;>*>>**=%%%*%%%%*u,%O%*::*w>%>w>%wu>%;>;6>>>>;---**,O>O&*&>:*%%*>%>;->>;>;;>>>>;;;;;;>;&&>;;>>;;>,uu*>u*%%:>>>>>%;;;;;;>>----;;;;>>>>>>::>:****:>>>>>>>;;>>>;;;;;::::>>::::::::::==&&&***&==&&%OO",
+"OOOOOOOOOOOOOOOO%OOOOOOOOOOOOOOOOOOOOOOOOOO>*O>*%*&&;&&%%%&------;--->>-%--%%--->uuww&O&>&>>Vww->w%%;-8wyuw>--;>;----%-;;;;;--;>%-%%>-O-------;;;;;;;;;;--------;;;--&&&&&&---;;%>8;;ww->%-O%w-%;;;;;;;>>>>6ww>>>>>>>6wwwwwww6>>>66>>ww>8>>>68>>>>>>>>>;&yy>;w>OOOOOOOOOOooOO&%OooOOOOOOOOOOooOOO%%OOooooooOOOOOOOOO%*&=>3>>w3==%%&&&&>w&OOOOOOooooooooooooooooooooooooo.ooo@ooO666wtxxxccccccccccNNNxxyw>=%OooooooooooooooooooooooooooooooooooooooOOOOOO=*oooooOOooooOOOOOOOOOOoooooOoooOOOOOOOOOOOOOOOOoO@ooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.p@odTTyAVCfE^5S<dd@=CCdL[EeffKfRRYSEU2==ooa$)EhSW$IffJ5.LpSf@`ER$sfoYdoe3&>w%>>Oed=333&&=&OO%;>@@fdo=o3>3>O%>;%%&>&**&&=3SdO@o=3=3eiiiwo=OeCO3O>%%>>&&>ww>;%&>w>:***:wV>ww*%,w>oO*=**=>&%*>:%->>%%%%*>%%%%%*%%%%******%%%%%%*************************:>:::*****:::------------%------------%%%%%%%%%%%%*%%%%&>>=ed1oO=****OOOOOu,%O%*::*:%%*%%>%;%O%-%-;;--;;;;>*wO>>%3::&*%%*>-6;%--->;>>>>>>;>>;;>>>>>;;>>;;>wuy,yAw>&>>:&&*%6>>>>>>>->6>;-;>>>>>>>::::****::>>>>>>>>>;;;;;;;:::>>>>>::::::::==&&%OOO&====&%O",
+"OOOOOOOOOOOOOOOOOooOOOOoOOOOOOOOOOOOOOOOOOOw3%>O&&&&&&%O%%&;;----;-%%-;-%---;>6>>w>&>&&wOw6%>%;-->O%>%%->;-%%%;>;;-----;;;;>;-->;>%%w;O;-------->>>>>>>>--;;;--------&&&&&&;;;;;%;;->ww>%;Zw%-O;>;--%%%%>>>>8w6>>>>>68wwwwwwww86>w8>>8w>w866886>>>>>>>>>>yy>%&&OOOOOOOOOOOoOOOOoOO&=>=&%OOOOOOOOO%%%OooooooOOOOOOOOOOOOOO===333ew>%%%&&%OOoOOOooooooooooooooooooooooo.....oooooo%;6rtcZnnmccccccNNNcxrwq:*%OoooooooooooooooooooooooooooooooooooooooOOOOOOO%OooO@o&%oO+O@OOooooOOoooooooooOOOOOOOOOOOOOOOOOoo+ooOOOOOOOOOOOOOOOOO%%%%OOOO%%%OOOOO.shE^UFy/FeLJS.hT@fU3oO&Dd2LhsSo5f`Yo=Oo+@=5LISK)E#Pg$sJKYs.KS)S5ggP^YC4dO3%yV%8wCDew*>&%>w>>ww&5CEY=<+=23>>3&%,:&:=*%*=OO31=3=OFiee<=OoO==3C&FHw%O&&%%>>>>&%&>w&**%%*wd,w3*%*:*3=@OOO&>&%%:;%%;%O>O%O>OO%%****%%******%******%%***********************=********:::---------::-%-----------%%%%%%%%%%%%%**%%%&>>=*>ADeO=***OOOO**%%%*:*****>>OO,-6>->>-;;;--;>>;*===yd%>**=>>=&*wyu;;>>6>>6666>>w8>>>>>>>>>>>>>>&>3>yCw3yu31>==>tuw6>;;;>wtu>-;>>>>>>:&&***&&***---;;;;;;;;;;;;;:::>>>>>::::::::===&&%OOOOO%&&&%",
+"OOOOOOOOOOOOOOOOooOOOOOOOOOOOOOOOOOOOOOOO=O>3&=%&&*&&&%O%%&;;;--%;;%%%---;>-;>6>%&OO;>;>%y;;;-;6%u6wu6>-ww6>>>wy-----;--;-;>>;--;8->xw%w---%%%--;;;;;;;;;;;;;;----%%%&&&&&&;;;;;-%%%->>;;tGV;>%u---%%%-->>>>686>>>>66www6888wwww8ww>>>6>wwwwwwww>>>,,,,,>>;%OOOOoOOOOOOOOOOOOOOOOO=>==&%OooO%&OOO%=>==++=+@O%*&;OOoooooooOOO===3tw>;&%OOOOOOOOOoooooooooooooooooooooo...o..oooOO%6wrtxZZnmmcccccccNcxtrq%%OooooooooooooooooooooooooooooooooooooooooOOOOOOOO&+oooOoOOooooOooooooo.ooooooooOOOOOOOOOOOOOOOoOoOCeooOOOOOOOOOOOOOOOO%%%%%%OOO%%OOO>uR`)PLDLdAydUf2YEL2fS3CLDD3ofCSSg)`h.<o==>o=.QERhg#sJhsp@W[KKgYJ^.s25ELCCeo3&FF%;3F&O>wyO%&>>;>;-55h2@=3oO%&wuOOwy>%=>%O==*O=eCC1C3&OO&=&==OO=O&3w>&%%%&>&&&%%%&>%%&>*%*>***%%%**ooO>31*O*%%%-%%%OO**%O%O%%******%******%%%%%%%%%********************************:::---------::----------%%%%%%%%%%%%%%%%*%%%%-;>=OoCTCo=******=>%%%*****%:*:>*%>%>;%;;%-6>;;;;;-CDO1w3*O>>>>33>*6yy66w>6>>6ww6>>888,>>>>>>>>>>>>OO=%>w*3y33ee11uuww>>;;;>wuw>;;>:::>:&****&::&**%%%%---;;;;;;;;;:::>>>>>::::::::==&&OOOOooOOOOOO",
+"oOOOOOOOOOOOOOOOoOOOOOOOOOOOOOOOOOOOOOOOO*OO&%>>=&*&;;&%%%&;;;--%>>-%%-;>>>--;;-;>&&w>%%;x%;6;%-%yw-;8ywwww>;;>w;;;;>>>-;%-8w>-%%;%;Vu-u;--%%%%-;;;;;;;;;;>>;;----;;;>>>&&&;;;;;w>-;;-%-%O>O%y%%%%%-->>>>>>>>86>66668wwwwww886>>www>>>>>wwww>>ww&&&&;;>>3OO%%OO%OOOOOOOOOOOOooOOoOO%OOOooooO=>=OO%>3332243===>wu==@OOOOOoOooOOo@%>w>%OO&OOOoooooooooooooooooooooooooo...o.o@ooOo%6w66rtvnmmcccccxcNNNxxy%OOooooooooooooooooooooooooooooooooooooooooOOOOOOOOooo@oOoOOoO=ooooooooooooooooOoOOOOOOOOOOOOOOOo=OeTD@OOOOOOOOOOOOOOOOO%%%%%%OOO%%OO=dFPPsfS3eAVDE=DdL$@@<3deO3Cde<@gpsYK.$@o=Oo=o+5# IpS p#KPSKRh5s#h^LpYS$YUC@wdVD,>6d^V%OOuuu,;>;->y++4oeo=OoeuO%>>uF3O*>*O=Ou33+@d3d3=<<<=OO<==O3O=;ww&%;>%>;;&&&%%%:wuw*%%*%*&*%%>+==OOoO&**%%%%%%:OO>%%O%**%%%%**%******%%***************************************:::---------::----------%%%%%%%-*%%%%%%*%%%%----oCwo=1o****===33:**%%%*>*>*O%>**%>;%>>;>w6;---%%__*3*Oe1yu>>13>=O6w;>>;;>>>66>>>&>,8>>>>>88,,88>>=3***O3%O&id3=w>>>;;;>>-;>>>>;;&&::&&**%*&>>&*%%%%%--;;;;;;;;;;:::>>>>>::::::::%%OOOOOOOOOOoooo",
+"oooooooooOOOOOOOoooooooOOOOOOOOOOOOOOOOO%&&&&&&&&%%&&%%&&>>>---;%;;-->;%%wu&%3uu5@@5+2T_C<O>ww8;6%-ww;-8r8669r986;---;>>&%3&O=o=;>--;%%w;;;-----%>-%>>>>%%%-;>>>++=&&&>6%;>%&=OO&>==O=3o@OOO%-%%%66->>>>&&==>===>>;>68>>>>>668wwwutw>-;>>>>>wwww=&=3>OOOOOOOOOOOOOOOOOOOooooooooOOOOOOOOOOO%%OOOooO>,;>88www>>>w688>%OOOOOooooooOOOOOO%%OOOooooooooooooooooo....ooooooooooooooooOOO@&=,,innnnZmnxmnnnny8%%OOOOoOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOO%%%%OOOOOOOO%%%&>>%OOooOOO%%%%%%OOOO%%%%%%OOo=o@.@Y#FDFCVwyDDue^S$#go<5=F3o3<+3@4EK4)5@+ooo+o.2.5KggjIKR!h5QfXS2J)fp@+fELo4DdF=@w3e3=^Yoo=edy&>%%%FyoeU2<+4o=eoOeOOO%3w=OO%=3Cdo%&oF]F=3&%yO>>&>>>-%Ow;777-w&@@==o3OO&>w,3uy%%&&>>>&*******%%---%%-;%%%%%%%%*****%%%*%O%%%%****%%****************:>66>***===*==>:**-*yu:%%%***::**%%*****%%O%%%%%***%%%%%&&&%%&&&&&&OUdO3%%>%%%----;********%%****::::--:>::*:*OO*eFVyuw,>>&>>>>>&***%*::**>1>>>>>66>8ww6>>>>>>>>>>>>;;wVVw&,%&>%>yO;;;;;&;>>>>==&@@OOOOOOOO&&&&&OOO%%-:---:::******:::::>>>>>==*OOOoooooooooooooooo",
+"ooooooooooOOOOOOoooooooOOOOOOOOOOOOOOOOO%%%&&&&&%%%;;%%%;;;;>;--%-;--;-%%>>&;wuw.+fof_{^==wdy,VUyw8ww>>86;;6rtttrrrw86>>&&=OO3oo%;>%%>>%;;------>>-->;%-%%%-;>>>++@O%&;>%;-O%OO33w=&OO2ooOO%>>;-8w>>6;%%&&&&====>>;>>>>>6688wwwwwuyu>;>66>>6www8333w3=O&OOOOOOOOOOOOOOOOooooooooOOOOOOOOOOOOOOOOoO%>3,886886>>>3688>%OOOOOOOooooOOOOOO%%OOOooooooooooooooooo....oooooooooooooooooooOO&=>Vnnxvt86tnnnxyw&%%OOOooOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOO%%%%OOOOOOOO%%%%&&%OoooOOOOOO%%OOOOO%%%%%%OOOo@oo.#pYSCDUUDt>LeaY^ppsoSCeL=Cd@=of4^gY++.o4oo=oo.S)WLKgh[`sXXpLh2Sha$fULf4f2oo43o=e=OoC3Oe&O>&&&w%%8%@<f+43=e3=3e333y3eweU^UO33%%3333CO==&o3*>;&&;;--y%;7%;t%w++oo3*u>>>>>>>3;&%%&;>;%*:>:::*:----;;;&***************&*%%%%%****%%************:**::>6>>**===*OO%**:;;*>>>1*%:*******%:*%%O%**%%%%%%**%%%%%&&&%&&&&&&&OeO&3O;%&&&-----***%%%%%%******:::--:>:*O%*:1eFJ***%O%&>>>:&***%=%O*1>>11>>>>>>6>>>>>>>>>>>>>>>>&&&>ww>&%iw&>%O,86>>>>;;>==&%OOOOOOOOOOO&&%OOOOO%%-----::::***::&:>>>>>===**OOOooooooooooooooooo",
+"ooooooooooOOOOOOoooooooOOOOOOOOOOOOOOOOO%%%%%%%%&&>ww>&&&%%%;;-%%-----&%&%&>wuw>TT+.f^T+Si&&>%yTnyuw88wu8>;68w98vxxxtw>-u>&%&O&LV%%w>%-%--------%%O%;-%-%%--;;>>@@O%%&-;>6;&>&*3>3&=&>d3OO%>ww66w>%;w>%>;&&*&==>>>;;>>>>>668wwwwwuyuw>>ww868www8ew33=OOOOOOOOOOOOOOOOOOOooooooooOOOOOOOOOOOOOOOOO@=>3uw6>66>>>>,8ww>;%%&OO@Oooo@OOOOOOOO%OOooooooooooooooooo....ooooooooooooooooooooOOO&,,8ww8>;9tnxtw>&%OOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOO%%%OOOOOOOO%OOO%%%OooOOOOOOOOOOOOOO%%%%%%OOOO<o+4fX=dddDFyDTDYssE)QWS@2SES@CEPhos#PW+.2@o+o@@2@fPf@JgsK$^P$W_LL^2gY_TY@f^oo=o@+dSedLd==e=OAVVO>%ww>+eD3e4=DF=CC3w3wO=3wdCd3dwO>=>SdoO=@w==%%&&%%%;>=OO8r6-,O2oSfO%iw>&&&&&&;&%&&&&&%*>>&**:w>-%-%%%::&&&***&&&*********%******%%*************::::>6>>::>==*=*%%*:;;*%%>w*O:%*********%%%%%*%***%%%%%%%%%%&&&&&&&&&&e=O>OOVu&&&-----**%%%%*:********::-::::*:***%%*=*>>:*>ud>:&**&:>e1**>>::>>>>::>>>>;;>>>>;>>>>>>;&;>>;;>>;dw%w,%uw86>>>>;&*%OOOOoOOOOOOOO&OOOOOOO%--::*::::*****=*&=>>>==OOOOOOoooooooooooooooooo",
+"ooooooooooooOOOOooooooooOOOOOOOOOOOOOOOOO%%%%%%%&&>ww>;>&&%-;;-%------&%>%&wyw>=D])So+@3FdOOe&O>uuw>>wuwyytyxnnxxxxxyu>-nw&>>O>TD%Ow;%>>------%%O>-O%-%%%---;;;>%%%%%--;;-O%3>O%;>&>>uCe==>>w86666--6>&w>>>=&==>>>>;>>>>>>>>>>66wwuw6>8wwwwwwwww33>=OOoOOOOOOOOOOOOOOOOOooooooooOOOOOOOOOOOOOOOO@===,uw->>>>>>>>wwww>>>>==%Oooo@OOOOOO%%%%Oooooooooooooooooooo..ooooooooooooooooooooooOOoOO&>,8>6wyyuw,,OOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOO%%OOOOOOOO%OOOO%OOooOOOOOOOOOOOOOOO%%%%%%O%=oo.K]WfSEYddU/T/C5fJ)IgIg.f4CSf2LE_sPR))5@+.@<oo@+2fY)KJJf#p_^LS5Y]Y44@LSo.@4o@ooo@3dLd3e3=>o=eyO%O&%>O4U=+=Oe2o===ew=3===2eCD@Oo22=3O23e=e==%%&;&%%>woeuO-6;&=@+LJ==O>;&%%&&&&&&>>&%%**&&%O%:O%->wtyy******%%********%*&*%*::***%%*************::::>>6>;:&&==e3=*:>;-::*:1%O********%O%:1q>%%***-%%%%%%%%%%%%&&&&&&&&OOO>OwUD&&&;----*****>qw********-::::::*:******%*::*%*>w:**:>>wwe1***:>1>>>:::::>>;;>>>>;>>>>>>;=>>>=&=>3*>=%33>>>>>>>;;%OOOOOOoOOOOOOOOOOOOOOOO:>>>>>>====*****O&====+OOooooooooooooooooooooooo",
+"ooooooooooooooOOooooooooOOOOOOOOOOOOO%%*O%%%%%%%OO%=;&&&&;>>>;;>;;-;;&&&>&;ww>*=oCL+=3Le&w&O<&O&&=>%%,,>>>,8wuyyyuwuyxu>>w;%>>>6y>>%OyA;%%-----%-Vn-%;-O-----;;;&&&&&;;;-;-&,>&>>>&>>>e>3>>>6666wnt-->&&>>>>>===>>>>>>>>>>>>>>>6www>>>8wuwwwwwww33>&OOOOOOOOOOOOOOOOOOOOooooooooOOOOOOOOOOOOOOOOO+&&>uw;>>;>>>>>88886>>>3=OOoOOooOOOOO%&&&Ooooooooooooooooooooooooooooooooooooooo.oooooooOoOO&&&>,ww,>>,OOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOO%OOOO%%%oooOOOOOOOOOOOOOOO%%%%%OOoo2.$``SULdCd>DSed2#IX|hsK hS45sfIWWR!#SgSYY5ooLe@@o@S^hgh4L({]YS5+Sf..@oo4JCY=@@o4dde@3=eOo3ewowwdu%%;=ODo===oOe&Owye=o33O@dCdC3==dC=+2=e2=o====>>>>>>+=3y;&wO=@(S@=O&%&&&&&&&;&&>>&&;=**&*%&3*>uxxVVA****%%%%********%*&%%*&****%%**************:::>>6>;***=>yw>::>;-%q>%%%%%:***%%%%O*quuq:%--------%%%%%%%%&&&&&&&&=33w&O&%;;&;;;--::**:>ww********-:::::::****>11>:**%%%%%****>>ww=***:>wi>>>:::::&&&&&&&%;>>>>>>;======&&OO333y=O&&&&&&&&OOOOOOOOOOOOOOOOOOOOO*=>>>==&=**==+OOoooOO@++@oooooooooooooooooooooooooo",
+"ooooooooooooooooooooooooOOOOOOOOOOOOO%%*OO%%%%%%OOO%*%&>%&>;--->>;-;&&&>&&;>=OO&F,O=F<CDO,OooO+3oOOooOOOOOOOO%%&w>&>wuu8-6->;;8;6;>;%wy%%%------%VV%O>;%--------&&&&>>;;>uw&%%%>>>&w>;w&>>>>>689wZV;->>&&>,,>;;=>>>>>>>>>>>>>688ww>>;>6wwwwwwwww>>=%OOOOOOOOOOOOOOOOOOOOooooooooOOOOOOOOOOOOOOOOooO&,uw666>>>>>>666>>>>>w=OOOOOooOOOO%&>>>%Ooooooooooooooooooooooooooooooooooooo..oooooo@OoooOOO>===&OO=ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOO%%OOOO%%OOoooOOOOOOOOOOOOO%%%%%OOo==+.4RSfLLFDCCE2oS)}[`gsSgsKPph$KgKRhPXS)#YL++d=ooOoo@2CSL@h5a..@o.oo+..L2P{{_S5=UYf4+2O23=e=o>>%ee>3===C=e=e>=De>w>3==dCe==23Fe=o=3o3<o+3d2=OO&===&%%4S@ey*=2o5`Wfo>w;>>>>&&&w;&;&%;w=%*>3>wuwyVyw;-;&*******%%%******>:%%:*O***%%***************::::6>>;**=>w>&*-;;-Oq>OO******%%%%%**:>>:----------&&%%%%%%&&&&&&&&>OO&u&O>;;;;;;;;>:***::>********::::-*:>>:*%%%%O>>:>>>:*::***:>>**:>**wy>:::::::&;>;&&&>&;;>>;;&==+====O@=@=YT==>>>;&&%OOOOOOOOOOOOOOOOOOOO%&>33==*OOOOo+@@ooooooooOooooooo.....oooooooooooooooo",
+"ooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOO%%%%%%OO*&&&>%%&&&&-->-&&&&&>&&&*OOO*GU%O%OoOoOOO@@oooooooooo++&OOOOOOOO%&>>6t;>n6%ZDt--ww%O>%--;;;--O>>%%;----------&&&>>>>>->%O>u>O>>-w,>u>>>>>6689>tw&;>>&%&>>&&>,;>ww>>>>>>>>>>>>666>>>>>86>6wwww%=&OOOOOOOOOOOOOOOOOOOOOooooooooOOOOOOOOOOOOOOOOooO>3,8ww66>6,>>6>>>>>>>,>&OOOOOOOOOO%>ww>&OOooooooooooooooooooooooooooooooooooo.....ooooooooooo&OOOOoooooooo.ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOO%OOOOOOOoooO@+oOOOOOOOOOO%%%%%&=Oo+ofE4CLDUTSLJE^J^``Pg##JSP_gIgkP#R}QII[_Ea@oO+OOO@+o+doo@d^f=+5ffJ22SSf4f^_TS4fD5o4YYS4eedC22@oe&3=o<LC==O=yO=&OOO=>3@O==OO=33CFe=+=e2@=Df+oo=22=O+=f]S@O==@55SW^3d%uww>>>;&>&;w>&>w>*&wyuwwO*>>*%%-::&&&************:*%&3>O***%%***********%*****--;>>>:**==**%--;;%:*%***:%%%%%%**:*%%%%%---------&&&%%%%%%%%%&&;>F>O&;%%>&&&>>>>>::***%**%******::::*%*:>***::>1q%%****:>:::*****::>>:*:,::::**::>>>>&=3e*&&&&&&*+++++=+++=ooYE=2;;>;&%OOOOOOOOOOOOOOOO%&%%&=>3wu@Ooooooo@oooo...ooooooo.oo......................",
+"ooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOO*&*&>>;&>>w>>>%%&&%%>;=%OOO&&O%&>OO,oOoo@oo@@ooooooo@oooooooOoO&&%&>wy88Z7rDvww>>>-%6%--;>;--;;%%>-O-;;-------;;>>>>&>>%wU/Lu>>->;&w&>>,w8667>>&%>&%%O%&&%&>w&>www>>>&&;;>>>>>>8w8>>;>>>>6w86%=&OOOOOOOOOOOOOOOOOOOOOooooooooOOOOOOOOoOOOOOOo@O&33;;8w86>ww,>86>>8,>>>>>%OOOOOO%OO%6uuw&OOooooooooooooooooooooooooooooooooooo......oooo.ooooooooO+@ooooo....oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OOOOOOooo@+=oooOOOOOOOO%%%%%O&o=+oT^L4a4LEC4+gY)Q`R)I#gsPRR#RQ~'s!RQsR{{E@=ooOooOOOoo@=2=T^d2CTf2EfUYS55@S@o52Sa+a42dd<dfddo=CL_LDd3S_S=+eOeCo=>%>%*=4e=+22@<@4S3o4o2C4oDeo3+3ee2=2e$'PES@=2$@ sY53Fiu>>,w>&%%>yy>&>1*=edu>&>>>:***:&&&**********&&&%%%%>uw****%%***********%%******-;6,>&******%--;:%O*q*O*%O%%%*::>:*%%%--%------:&&&%%%%%%%%%&&>>3%3>O>w&&&&>>>>>********%%****:::::*%%:,*::*%%%%-;>>;>wt;;;>>>>;***:>::>:::****:=>>&O&uV%%%**%%%ooooooo@oo<o=eo+%%&&&%OOOOOOOOOOOOOOOO&=&=>33wuu@oooo@ooooo.....ooo.............................",
+"....ooooooooooooooooooooooOOOOOoOOOOOOOOOOO%%%%%OOOOOOOO%%&>ww>%,yy>%&&%=3>OO%OO&&%%OOOooooooooooooooooooooooooooooOOOOO>txr676-Ouuu>O>>6%%>-%--;;;>>;-%>>>>>>;;>%UTOwFw&=*>=_UOu;>u&%>>>w>>86;8u>%F&Oy&>>&&;>>;>%>u,%&,>&&>>>>w>>>ww8>6>>>>>>>>3&;yi>OOOOOOO%OOOOOOOOOOooooooooooooooooOOOOOooo@33>>w8;886>6www88wwwwww,>&&&&OOOO%&wuuwuw,=%Ooooooooooooooooooooooooooooooooooo.............oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&&OO%%Oo@@o+oST<o=oOO&OOOOO%%%%%;oo<o@T{e2LaDo2oLLII# sgXIK# XhghRj#RkPYKYSoo@OO,O%OO&o4oed+235fef2@ooS2.@@fS@+5h+C2.45oSd4a=of2=dfe=o2=3DoCFo33333oe>>=o3oed=@eoo+USJ4deo=UfoC=@2D4oeS #@YUo@5h)g5YsoUFOw=&>3=&*>D>=eO1OoeCe>O>*%&>**:>O***>&O*&*%%>>%>*%>&VyAV>O%&*>OO1oO=O1&%3w>%**%-6%*w>OOO3>Ou*%-O=>*%OO%%DVO*>*du>%O>>OOO;>>-%-%%>&O>>%&%%%&&&&&O>=%>w>&>%%>w6;%%:>:%%*>%OO%*:**>O::DFiA********----;;;;;;;;;;;;>>>>>>>>>:::::::==%OOOOOOOOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOO%%&&%>wwww>%@@@ooooo........ooooo...........................",
+"......ooooooooooooooooooooooooooOOOOOOOOOOO%%%%%OOOOOOOOOOO%&&%O&ww;%>>>y>O==OOO%%OOOOooooooooo.oooooooooooooooooooooOOO%;;--66;ZTyw-y->;->>;>w>;;-;>>>>>>>86>>;w%ZD%%>>OO&e^)U=O&UVuD>=3ww6w86r%uwwyuO>uw>>>>6>,&>>&>>;yw>>>>>w>wwuuww>88w886>>w>,uu>&>%OOOO%OOOOooooooooooooooooooooooOOOOOoooO=3=>ww6666>>,wwwwwwwwwww>>>w,;%&&&>wuuwtuw3=Ooooooooooooooooooooooooooooooooooo................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&ww%3o=<oLDs.+o3OO%OOOOO%%%%O&Oo=ooCEDSL54Lp)R#   XjPP!KsRW~PjRW~)W#P+.@@+OoO&O=O%=3=O=+@Sdod2=fS3@5+@e44f4oET+24+ffS=CooCdf@Ceo+o=oo22d2aS2D4dd=eCVSSe4232e3SfS_])e5FddF4=52@o2.@5oWhXfYLLhs)EX@5oSe33O33%eO33e33O3O3JVeOOu&&::>>>>>O*:OO*>:>&****%*&w>O%%w3%>DA%%>Odd1Oo&*%>>*%***:>uOuL^11OOOyi%,>ywuDDyuyDA&>*O*OwOOwOOuw*O%;;>;&;%%&%%&%%%%%&&%=u>OO%&yu,;>;%%-:********%%*****>y:*TFO>::::::;;>>>>;;;;;;;;;;;;>>>>>>>>:::>>>::&OOOOOOOOOOOOOOOooooooooooooooooooooOOOOOOOOOOOOOOOO%%&&&wyuw>&Ooooooo..........oooo............................",
+"........oooooooooooooooooooooooOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOO;>&%>>>3ooOO=3=OOOOoooooooo......ooooooooooooooooooooOOO%%O%>6-VTw-;V-t%>w6;wt>>;-->>>>>>8www>>;>y&&*O=e2oofdO@>>;3FDd>3ew>w6>ww&w&%%>,ww>>>>>>3>>&&ww&du3>>>,w>wuwwuw>>>>886>>>>ww>&>w%OOOO%OOOoooooooooooooooooooooooOOOOOOooo@=*&www66>>>>,3wwwwwww8wwwwuuw>>>>wwuuwuuuw3=OOoooooooooooooooooooooooooooooooo................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&%O%wVu&=do=oo$@.+.oo3OOOOOO%%%%O&OoO@ooodDYUf_)P# ## X$I))IKKRWP PRQj!#o@oooo<=OOO&OOo33+ooofe2df3SL42@<@dd+4f2=S=+FaCSY3=4Cooodoo2+d^h+2Do@4C==d4=Sd+LdF4ed3ff3Lde2f=o@fd4SYL.5@hLSsE)`hXf_Lo4 I)KR5<U2<o2fF=@3Uao=2o@@U_e====*>>*%*%O**>,**:%:****%%**O:O*:*>*OwLD%O*=33OOe3*=>>>&:>>uO==O@^)S=33eF%wOe>eUD=u%3>*>>&=O1OD^>O&*%:>*O%>OO&uu>&O%%%&&&&&wy>>Vy>ww>>;-%;6:::*:::>:>>:****O%%%wO*>>>>>>>>>666>>>;;>>>>>>>>>>>>>>>>*&:>>>&*OOoooooooooooooooooooooooooooooooooooooOOOOOOOOO%OOO%%&&>uyw&%OOooooo...........oooo............................",
+"..........ooooooooooooooooooooOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOO%&%;>%%%*%OO=&+CD3Oooooooo..........oooooooooooooooooooooOO%&%&>;%%u;%8->V;>w6;>w;>;--;;;-;>>wwwww;>y%w@O3<@Cfo3@2&eO3eo=3=3>&>>;6eO=3w%y;>>>>>;;>>&>,>wu>w3>&&;,w;ww>>uw>;>>8wwww&>ww>>>>%%OO%%%OoOOOOOOOoooooooooooooooooooooooooOOO%>ww666>>>,,wwwwwwwww8wwuww633wwwuuwwwwww3==OOOooOOooooooooooooooooooooooooo................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OOO;w>%dfoY_KLKh@S5+oOuOOOO%%%%%%OOo++o4oo=S24@... $sh X}`PWP#g~KRXhhKQ.2+pSfeO%OO%o3O<@ooo=oo42e=eCCFf^d3eCDd2eLS24@f4YYdToed4SS22fLY<^W4S)a+22o44f+oo=+e3UeF4+=@d@==ff22<44SSLh.QfRE'W52o4e4$#g'Ph#CEo@dL4fFd4S+eeo34d=eOFdO*=uu>>ww:%>>*%>wO*%%**%*>Vwy%w:%O*>>wuuy%==e=oOo>*&=;&%&&Ow=d4=@=Se33o3OOO>OwVyO*%O%==&*O==2L^d>o=oO%==OO>O,Vy>;O&&&&;;;;%>OwDVO%%&&>>;>>%;>>%%&,>>>&&;;&3=>e>&wO>>>>>>>>;;;;;>>>66666666>>>>>>>>;>>>=&*%ooooooooooooooooooooooooooooooooooooooooOooOOOO%%%%%&&;>uuw&OO%%ooooo...........ooooo...........................",
+"...........oooooooooooooooO@@@OoOOOOOOOOOOO%%%%%OOOOOOOOOOOOO%&>&;&%OOOOOO3=oedOooooooo.........oooooooooooooooooooooooooOOOO%>,%O;>--wuw;>w>-;;--;;>>-%;;>>6wutyOwuC2+2@.fhhdf=o&e=3eo=@3>=>>>6>>yOww%u>;>ww668>&wdu>>>&;&&%&>,6ww>>ww>>6wwwwww>>>>>>>>%%%%%%%%ooooOOOOoooooooooooooooooooooooooOOO%&6w66666,w3wwwwwwwwww868886,wwwwwwuwwwww333%OOOoOOooooooooooooooooooooooooo................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOO%%OOOOOOOOOOOOooOOOOOOOOOO%%&>uy3odE)YPQKE_DoowOOOOO%%%%-OOOoO=Ooo2ooo.@@+@sWRK..Y]gKKRPIQWKWPhg=@oSTdOO%O%&=F325<@.4+4dLd2@3e@=U3>OeFo=eoodfo524dY34oo=245fga.@Y`@ShJ2^L24@o+fde4LdD+2af@eS5dC3oo5o5+4Y@p$$.4sXhWY2eCd5p RQ ssSSfhSo2sao+fh5fD<ooO33ood%>3&>uuw>3*&%Ow%%%%*%%*>yuA>>%*w:w%O%iF>3O+=ewo>=>33>>;&*1oo2S25ef+=o=4O33%3wDdo3O=3&O&&oo5@o=fd+@3%O>=3A>>w&%&&&&&;>>>>O>&>y>%w;;&;;>;%>>;;&;>>>>;&&>>&O3OO&&%w>>>>>>>>;;;;;>>>66666666>>>>>>>>>>>=&%OOoooooooooooooooooooooooooooooooooooooooooOOOOO%*&&&&&>>>uw>&&;;&...ooo..........oooooo..........................",
+".............ooooooooooooo@++@ooOOOOOOOOOOO%%%%%OOOOOOOOOOOO%&&;&&%OOOOOOoO=oooo................oooooooooooooooo.oooooooooooo%wd>-%8OVy>y>>u8;;;--;>6>>-;--->6wtu>ywCLJpKJ.2h+afUF=O=2=+dCdeuw3w=e)FOyOyw;;6w6>63&wVe&*=&>>=&&==ytww6>>>886>>>>>w>&>>;>>&&%&&&&%OOOOooooooooooooooooooooooooooooOOOOO%>8888wwww3wwwwwwwuuw866668>wwwwwwuttuw3333=OOOOOOooooooooooooooooooooooooo................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOO%%%OOOOOOOOOOoooOOOOOOOOO&>>&>uV3eo<55X S{Y.=3OOOOOO%%%%%O%&OoOO=3ooo+o.f+4W`S $#.YE.gPRgQIgh#IKo@+dVOO>O%O&=d2=g52hWLSfd@==ed=VwuA>yF=eCe3oodL=24=LFL4+o@gS+@2Sg.fs_QhLo$f45+5SYe=odC+2Soddooe++4f2S+2YsPp$#YJXhh2a==DSpSWWQ#Y)Lf2$hLfSfY{($$+53e==O=1o>1>**,3>>>wFiO,w*>>*%%***O>%&>wy>w>>%>y>e3oOLL>&=33>>,>&3@2dfoo$sD+++4S1o333OUDOOoO=OO=34+45o<SE=o2=3d+=y>&&%O&&&&&&;;;;>>&&>;&>>>&%->6>iw&>uyw&&>>&&>>&>O>3&y>O;;>>;;;;666>>>;;;;;;;;;;>>>>>>>>>>&*OOOoooooooooooooooooooooooooOOOOOOOOoooooooooOOOO*&&;;&&;>>>&&&&>,&Oooooooo.........oooooooo........................",
+"...............oooooooooooo@@@OoOOOOOOOOOOO%%%%%OOOOOOOOOOOO&=&%%OOOOOOO&OO==Oo+................oooooooooooooooo...oooooooooo@24;-%-OVutw>6uuuw->;;>>>>;----->>w&yy=dYLKRS.#s2.23C=e=@E^SDCe3uwu=w__uyw&V8->6>;>3=3e3==&>3w>==>>yuwyu6>w6>>>>>>>,>wyu&&>>>>>>>>>==+OOOooooooooooooooooooooooooooOOOOO%>68wwwwww3wwwwwwwwww886668wwww66wwtuuuw332>&OOOOoooooooooooooooooooooooooo................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOO%%%%OOOOOOOOooooOOOOOOOOOO%OOO%>OY422+sI)L.2oo>OOOOO%%%%O%%%OoooOOo=oo=hLLKKYX $@.5S_KXghRIssP_So@&OO,OOO%Oe<23d5#pW)P4+4dfe3w3yVVw;uAVO>o=Dd=24e=oDoU)<fER.2pS5$#pSSPsXp.sS++5s5422oo2L^fCSFe2=++ofL.L]SRL $#LRfSedD42@L|RW[^^S^LPfgh@h5@SSLf.geOee=o13Cyw13ww>:wwDA>u>*ww*%&>%w*%%%wO%>,>w*O3>3/U2Cd==O>=OO>>OoS2<5o5.fJ4o++a3=e3eOFd==&%OOOO%22.e5ooFEd3dYEf4&;&&>>&&&&&;>>>>>O%&%>>O&>>;;6wwVu>>yyw;&wu>&&>>od__OO%w;>>>;;;;6>>>;;;;;;;;;;;;>>>>>>>>;&%OOOOOooooooooooooooooOOOOOOOOOOOOOOOOoooooooooOOO%&;>;&&&&>>>&&&&>>;%oooooo..........ooooooooo.......................",
+"................ooooooooooooOOOoOOOOOOOOOOO%%%%%oOOOOOOO%OO*==%O%OOOOOOOoOoooOoo   .............oooooooooooooooo....oooooooooooo%O>%;;-A;>wutVy%6>;----%------;;>>O3e42R[JWSEYs2oSTDeLEEdf4O&3ei3=OLuOy>Dy>>8>;6>==&&3w=>ww>=>33u>wxyw>u86>6wuyy>wVDFw&,w,>,www,33===OOoooooooooooooooooooooooooooOO%%>688wwww,,uuwwwwww>6886666wwww668wwwuuww3>3=OOOOoooooooooooooooooooooooooo................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOO%%%%OOOOOOOOooooOOOOOOOO&%O%&;&&D+@.5KW[^ @oo@OOOOOO%%%%%;%OOOOO&O=oo=+fEPPY)PKso..@WSJPJhKKYKS@Oo&O%,O%O&OFd3ST5h$g$2<52Ddo=CD>>VwV>>TU*SSCeCe+@LCe=+oSL2spLsQ@I#JgpR#PpsS)[_5.2=o2C=fCDe+o@2+FsL52K2L5fEKggKgPSadeLeCfP #Ish L^+h@o5@4oL5.YLSSS3U43dV*e=O%=>>>wV%&,uFO*uu*%>w*%*>wO,%w%*O**3Vy2_/o=ew3wdy>>dAud]Fa5@phhKS@=o2CTD=CVCO333==3w3wS^fhhf<fY=oo@@oduy>O;>%>&;>>>>>>eeCi%wFA>uyu>>>;>,>>&&&;&yVw%%>,3=LCOyOw>>>>>>>>----;;;;66666666>>>>>>>>&%OOOOOOooooooooooooooooOOOOOOOOooooooooooooooooOOO%&=>>&&&&&&>>www>;>wwoooooo..........ooooooooo.......................",
+"............    ........oooooooooOooOOOOOOO%%%%%%OOOO*%O%%%%%%%%.......................................oooooooooooooooooooooooooOOOOO%%%&&%>&yuw*O=>%=>O==%%O===&%==34<f_KWPIPKRsYEh L$KYo33D;w;%d>%FyOu3*ed=y>>;>>w6>>w&;d>O3=3uw>>w%Vw;Vu;>yAy&3ww,wwwwwwwwww8wwwww6>>-%%OO%%%OOOOOOOOoOOoo@@o@oOOO>=>>w886666;w>>w>-ww886668w8wwww>6yuuutuw868;%%OOOOooooooooOOooooooooooo..............................ooooooooooooooooooooooooooooooooooooooooooooooooooooo.oooooooOOOOO%%%OOOOOOOOooooooooooooO&Ooo=o=o+@@fs'Q`{[`gs#oo=Oo%OOOOO%;%%%%OOOO%%-O%o.JJWJJ`RX$#$!)`KIW|)ILY2o+OOO*O%=ooO+44aSSpKEh2Ks54<+L=e&w=o22dS3C=3=deUee%TC+efh.sW)WKgKhde)L5S2L42^EY`s5S.45@S'L<ULEDfDfhY2.S55o@K_KSSf+=&==oa$#$gpLYp5$<efaLY5f5.22OCVO33dO3T3de@+e2eO=$$.5C42o%wO&>u%wO==>w&%>w&==d++2+o4UETeefY5DCeL=^_oFL@E`]^ho^_hL^SSLSYELf4^^fafS_/w>-66-%-;;%%&>=DUdO*3&uuw>wxt>uuiiw,w,>>>>>>>>&>>>,>&&>O==3eOO>O**>>%w&>,;&>>>>>>>>>>>>>>>>>>>6666>>-%OOOOOOOO@oo@ooooooooooooooooooooooooooooooooooooOO%&&&>>>>>>:;;>,w>@@+++ooooooo.........................    ............",
+"..............  ........ooooooooO@OOOOoOOOOOO%%%OOOOO*==%%OOOOOO.......................................oooooooooooooooooooooooooOOOO%&&%%wO&%wywOw>O>=O==&3=>O==>ue=dTL22hLQ'R#gLSPK5sLLL@@SeAw>=&eDDC3=>Ody>&&3t>6%w>uw>>O%dwoe>>;ww;VuwTFOyd>;=>3>>>>>,wwwwwwwwwww86>>>>;-%%OOOOOOOOoooOooo@oooo=+&>>,wwww8666w>>w>wyuwwwwwwww>w6>wwwyuyyuuyuwuw>>&OOOOOooooooOOooooooooooo..............................ooooooooooooooooooooooooooooooooooooooooooooooooooooo.oooooooOOOOOO%%OOOOOOOOoooooooooO=Ooooo<oOooo@2.s{{`)RWIPKo@oO=*%%**%OO%%%%OOOO-%%OOo.gRKI`hX#gKR`[)[RhPX.o.2eo%:OOyooo+o@D)42=pgLg5Y$ffeDEdeeeaEdo2f2+eOedd==3=e<feaffSW{{`KWgLfoFf=fSf44@f@$Kffffp@fSfLE`^+2d2.s_[^oh$S5ff@psedOod2s#o5##'L.5<++<45#sSTL@=d%O==d2Cd3e4eCd=e=+@55+2o@SO*VO>Oyye>%O%&>;%O3=o+5fYEDffT4@45dd4(ddY42oodode@fCLTSf+o54@5SSD@+@.o.4%D>%68%r;-%->>=%=ed3=VDU>ww>>w8;,>,w&;>&>>>>>>>>>>&&&&&;>%>3edee3Ouu%=>&;%%%O&>>-;>>>>;->>>>>>>>666>;-%OOOOOOOOOooooo@@oooooooooooooooooooooooooooooooooOO%&&&>>::*-%--;*&&Oo@o.oooooo..........................  ..............",
+"......................oooooooooooooooooOOOOOOO%%O=1=OO*=OOOOOOOO.......................................oooooooooooooooooooooooooOOOO%**%VUuw%O>%d&OwUeO>3===>>>3OEFoCS5f+45J)_Wh4545Ihs5S)f24=w&d@=C=@=eeO3uFDd*u-u>Awy&>w&3e&&e>>&w&&w3w%%u>O3>33>3,>>>>>,8wwwwwww866666886>-%%OOOOOOOooOooooooo===3>w3>68wrrr9u>yy%-w;wwwwwwwwwtw>wuwwwuywwytwuuuw>%O*OOooooooooooooooooooooo............................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOO%OOOOOOOOoooooooo@ooo++Ooooo4sS+osoYK### IXsWs.ooOOOO%*%O%%OOOOOO%%OO=+@gRgWRh`)RRPWhKWKK$$s@o=o3o=OOoOo+=oo@eSdJ$5$@Sos4ffd33ededTd2=YU=f=@34dDC3L2D52JfW5QWsJRs=FeS@5S(Tff2EL5#$Sf42fCh@fooo4dfLspYf$452+.EJhL.3=d3@of5K^Jf$h^EdefLh$psf)Eee3wDed3=eo3==o33=OeLh$2+aSeCCeD3e>UAo=CVw,uwy*wLFLLsS43D])o=o@2F+LeTfodSCeo+o4f24d2a<+22oo==S@+2o2SFeFO%yw%w;;;>>>=*=+O@==3wO>w>-;;->&&;&>,&&&&&&&&&>&&&%%>&*O&*=e3ee&FD3yV>V>>>%%>%;;>>>>;-;;>>>>>>>>;-%%OO%OOOOOOOo+OoooooooooooooooooooooooooooooooooooooOOO&&=>>:**%%%--%&=+@@..ooooo...........................................",
+"oooo................oooooooooooo@oo+OoO@OOoooOOO=23=oooOOOOOOooo.......................................oooooooooooooooooooooooooOOOOOOO%OA&%O&>uuOw&FAFOVyO%Ow&O3Ae33=SES<@fS^).+gEL+#@hS5SpeCFTaS22+C+oo=33wVy>>%wwFuu%>wyyO=FOuuwV>wwuOAwO,>&;w3>ww>>w>>>8wwwwww86>688wwwwww>>===>=&OOoOOoooooo4=>3>w>>>>8rrw6>>wuwww%wwwwwwwwuVy>wuw>wwwuuuuuwwuuw>>w*%OOoooooooooooooooooooo...........................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOooooooooo=ooo++@o<h^^YRhf.Sf #YR)#X){Po2+oOOoO%&%%%%OOOOO%%OO@.osf5RRsgJssRh  X X$#gs@@oO+oO3o=oooSL4o2T+5f.L)DSdf42oCeCSeaCe+LS=e<LSTCEd+Ufo+a$SKXR$I5W#+42e2Y+25$ULfS2fSa2f4++5fSff252<@4.S)Ph2.S4425h`DO=FTES_KSE)sh{)=o2d5+ph55o=3=y3dD3e=ed3DdDSC3S/{YdLDd2eCe3%oO3>3=33eCC>3eT[]s4SfafLY5d424of4o2S@Sf=2o4o@o23o<ao2=oo==oo=US+@o@Oo=3=O;wO%6uw>%&>=OO=3OOO%>w>-;;;>&>>&>w>&&&&&&&&&%&>&&&%>&>*O=O=%eYLOO3wFwwu>>,%>>;---;>;;>>>>>>---%%%%%%OOOOOOOo@ooooo@ooooooooooooooooooooooooooooooooOOO%&=>>>:::::*&&==++@..............................................oooo",
+"ooooooo.........oooooooooooooooo+oo@ooooooooooooo@@oooOOoooooooo.......................................oooooooooooooooooooooooooOOOOOOO%%w&O&VO%%yDOO,UF>wwO>VFy>o=V4O=+d+@=4SS5LSshSRP)K@$ooTYL2J2+C)T23d>y%3O>>==>3>>>O&>uwD/V3==y>u3y>DVO>3>*>>>>>>>>>>>68wwwww8>>68wwwwwwwww>>33>=OOOOO@ooO+=3==>>>>www8866;>w%-FDxy866668wwwVn86w86u>>yywwy>>wuuwuyww>=%OOOoooooooooooooooo...........................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOoooooooooooooooO=@ooo2SsRsIW}[D2.+XPRIQ R{{If.o@+OOO%%%%%OOOOOOOO@@o$ssKIRh  sKsX##Xg#.X.@ooidL=eC_Co@YL)D$fJCsCLLLCf^YodFfoe4o2C3ddFD4dJEF=deo+ohf4)E.Yspgss#)^o52f52asaS+454aefSL5.<f4f+oo4@ghs@W_YL_s5f4U(`D3dOoES25.5fpSE.2<d24f+f4+3S3odd=edd3Ce3deDde=edYLd==34oeC2e@2oeo3d3O&>=odeC)T4o@<22f)eeo@=222<fS2<2d@@<@<==O@3Oo+OoOOo=oCCe3L/C3o@=O%>&%>ww>&&>+====%&&>>>>;>>>&&,w&%;&&&&&&&&&&%%;&%&&*O>%OOO=3O&O=e=O>%&w>ww>>>;;;;;;;>>>>66>--%%%%%%OOOOOOOOooo@+oo+ooooooooooooooooooooooooooooooooOOOO==>>>>>>3>:&&O@@o............................................ooooooo",
+"ooooooooo.......oooooooooooooooooooooo=oooooo.oooooooooooooooooo.......................................oooooooooooooooooooooooooOOOOOO%&=OOOiUwu&DU>>OuUVFTwDuLVowF3o=3e=2<oeLeS^hD)L5))XhSPL.fss5#SKWYffC=UFdO,===3=%O==u%O;&%&u%=3%=%3euwu%Ou==3ww>>>>>>>688www8866888ww8>>>>6>>>>>&OOOOOOOo@=3O33*>>w>>8888wrwFy%VywF66>>>>>6;tt>>6>ww;>uu>>tw,wwuwwuyyu,&%OOOOOooooooooooooo...........................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOooooooooooOOOOOOoO+++2sfLsPKR))W3oD^XsPKg #IIhYg..o@OOO%OOO%OOOOoOooo.@XXsKK)YhhXsRK#))5X$.5CCLDL5fJ_Efh2gfLSs#sadS+F22a+dfdES=5UUFdf3YeC=e=d3S=4Sf@S5sKs$EY$5SfdJ<Sa@SL+SLa55of_TL5o5f2f[Y.KT@fJ $f $hYSfffh54+>&O=S2@$LQ4o2JLS<4F24fooa4@=e3>>=oC2===e3=e3333e@dOCT4o=O3@2deo=+322dd=oe4@oDE+L4@+a^{S44o+2o5+CS+542dCoSU3o3&Oe>uw>=%O>OVOOCDDCYDd+fd&>>;&>3w>&=2<OoooO>>&&>>>;&&ww&%&%&&&&&&&&;;%%>%%3OO>=&3=e3eeOo%*yO&>>>,>>-;>66>-%>>>>>6>>>>>;-%%%OOOO%&%O+oo+ooooooooooooooooooooooooooooooooooooOOOO=>>>=:>>,>&O@ooo...........................................ooooooooo",
+"ooooooooooo.....oooooooooooooooooo@@oeh<oo......o@o............o.......................................ooooooooooooooooooooooooooOOOOO%&e%O%;VOOODF%>>%%O&DwDATU=d`^=edo=3d33L3oo5CRY.SJK$K5YW)sSsgYPh+oofeUd>&F2=43e=>=*>>>y>>UD3e33=O>OLdo33O&=edw>ww>>>>66668688ww886ww6>>>>>>>>>=&OOOOoOoo+2CoCV%>&i;>wwwwxZ6FV;;%%y86>>>>>>&w>>,>>wwww,,wwwuwwuyuw>uuuw>;%%OOoooooooooooooo...........................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOoooooooooOOOOOOOOOo@pSKg5hgKjPg odCs.Xs`QKP`WIW_$..o+OO&OOO%OOOO++.@@.@ hYWKRI`sIK`IJKKPK#4SSYY+522fhEJSShYsYgsJFU<S2=3dL+252E`EUC2e=d^=e4e2fTL42Eg@S5Sh5@^P`^+2TDf+545o<SY5fSfL^@3J2fh2+L+2@+@#XPghhp .5WS<S45fV==fS2a.h22sS.LTCdF3+dddoee=33%dd=C=3dded+=3=2@33d&3LL42+=@+dSd@2Cd=2=4Lo3d=+Lso4Lff2C])_Sa4=+=@ESaEL4DDD==3%>wO;&&>>ww>&OO;%%3O.LE44CeO>&O&3w>%++==++&=>;&;>>;->;,3&&>&&&&&&&&&&u;;y,Ou>>u33eedUCVe==%O=Vy&>;&w>>>>>:**>>>>>>>>>>>>>&&%%OO&>>>&=oO@o=4oooooooooooooooooooooooooooooooooOOOO=>>>>***==%O@ooo.........................................ooooooooooo",
+"ooooooooooooo...oooooooooooooooo@o@o.4f.o....   ......oo...............................................oooooooooooooooooooooooooooOoooO%OOO>OO%,yO&Vy>>>w;%&&&%%==Udo3Oe=w33>d>u2LSS)ESsgKIR[{'sKQg#LPf4eD2==yFDd3a+d=ddC%3w>>;VS=3O=OO&O&O3>O=3%yVw&>,&,>>666>>>68www86wwww86>>>>>>=&%OOooooo+3DOLD&>&VuyxywwtV%-%%>uw-ww6>>>>>,w>>w>&>wVVwwyywuwwuyu>;wwuttww6@OOooooooooooooooooooooooooooooo...........oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOooooooooOOOOOOOOO==+4SSgKP!##)|Xoo=s$$s[{{`[[)~`J5.@+oo&OOOOO@@@.o.sKPEPWsg`{)hg_gsgSWhRKEP#fF5L4Ss@SEsgKSKg5#sSd=4UUe+fSe=ddLLDdee3OeS22dT42odDfWS@#+55fh$54@4aLfC@52Sf44.Sf.s24<2f@F545.oh`hJf#KWK^R#5LS<@442=&O=3o@5T)+5f2d3@DSLD@+d=3=e3ed=3=2===USO==3e3FeOw%Ay&Cdo+522oCF25Sd+4++D2+255U`d@TSdd@4)`Y)f44C4244^)L4Ce&>&&&%w>;ww>>>>>&&&%O%>2.SS2o2e+&&==>>>5@ooOO=3=&>>>;-->&&&%&>%&&&&&&&&%yuyDyOu>*>OOOO=do=e>ee*wDA%&&%uuw:%%*>w>>>>>>::>>>,,>>;&&&>wuw>oo++oFUeooooooooooooooooooooooooooooooooOOOO=>>=>&OO%=+@o...... ...................................ooooooooooooo",
+"ooooooooo..@o.oooooooooooooooooo@ooo.oo@...     .......................................................ooooooooooooooooooooooooooooOOOOO=&OOO%%%,>>ww>>>>>>>>>>>==oU=>>33yD>&3y>+TDdSP^RYIsP_)shSKs5LsY^SDCDyVd3CCF_C+3CTV>wOw&%O=oeeC=O==o3=Oeo>>&%>uu>>wuw6>6wwwwwwwww88666>>>,>>>3>&O&OooooO=w>&&;;;>>wuw>>;->>>>>>8w>ww>->6wOFw,u;V>wwwuuwwww>>DTu>y8V8xZuxwd@o+ooooooooooooooooo...oooooooo...........ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOO%O3+$RsJKgII'[Xoof_^R'[`{hP[RIsPs .+o+oOoO=+o+S)P)`W)P)`RsIRRg#gJKIsg#KY)ISs44Ts5IEYSfPhIh$5gKgeTY2eEFedDDSD44=CdDT+CO2e@5f@e45s]Yp42fKS..SYoSL22YL.55f5oChhS.^)+f5D4faf(E4YY[`KRJpp$$@$S2+@3=3>O===2=E^h54oCe=&eVLyOd>=3DV=CCooD4=dTdd3@eO=OO=>->w=3d5do5@2=+CaS+o@2o4+ed4D__eS4@fS=o4Y@@a@5Df4S+4Uf32=3>&&---;;;>>>>>>>>>>;--o=+oLE=<fo=33&3O2@ooo==O>&&&%&&%O3&O=>O*O3O33O3&;&&>>&%%O>*&d=3O=3=O=3eCO>Oe&,,&quw:%*>>OyN>:q>:%ww>ww>w>www>,yVUO2++4e=@OooooooooooooooooooooooooooooooooOO==&O3w^Uo<oo.....        ......................oo..@.......ooooooooo",
+"ooooooooooo.....oooooooooooooooooo........      .......................................................ooooooooooooooooooooooooooooOOOOO=&OOOO%%%%%>,>>,&&&;;&&&==dEd&3=&>3wUuOFDe42o5E5$sSgsWgSsghsQf25aU3UUOuCfLCJSDDCL333Few3@434o3@@Oo242==4=3w3>>uy>,ww8688www8wwww8888666>,>>>,>=%%%%OOoO2>>;>w,>>wuw>;wuyww86>>>>>ww>>ww>U^F&d>%uwwuwww>>wu&&i&wuwww8ww>w+ooooo=OoooooooOooooo...oooooooo...........ooooo................ooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOO&>&o@2ESshgP)XK$@@oSh sRK)QW[IIIRKhRS@o=+o@+.^g5~KIRK$gWQ)g#sg$ghRghshYKK#gIfpsLKhK)WPhgs5Ks#KKgeLL=4e=SCdeSeC^DuFyVST=e=d+FLS4C.fJf+4)f.CS25D5Sf5L^4LL4<S225<@Sf2ffS4552YS@SELSsJfsSJSp4<23d=Cfw&oe+eSdo2<+@3=dddFTDOw3OO3=o3e===4oeo=LLO3e=O3+%u>&=4+2fCoaLo3Tfo2L44f25252L23=Cd=4eeFodYSo2+oCLC2LY=o&%3%Ow>O-;;;;>>666666>>;;@o+e=E_doSCedow>ooo=3==w=%&>&>>&*>*w>O>=O>OOuDFO>&%%%O%&>>&3FCVeee3OO@%eS%uOOy33%%*>>*:qiywww%Oq%w>&>3&O>wuww,wuSo+o@eC2@OooooooooooooooooooooooooooooooOOO%=>=&o3^T=o.@...            .................o.o@@@+2........oooooooo",
+"oooooooo.@...o.o.....ooooooooooo...........     .......................................................oooooooooooooooooooooooooooooOOOOOOOOOOOO>>>8wwwu>>>>>;--=oo=4o===3w%yi,>>=e<2+S$5I|Q'Whg5))WLS`L<SSDdedeLYSUo4ff34d=2=w&D3=oo=++oo+32@o=>&%&>>>>w>>>ww8>866668wwwww88666,>>>>>>&%OOOOoO%3>>ww>>;>wwwwuuwwwwww6>>www8www>VFu%ww>wwwwww3>>>u,%;%uw>&VyyVwiCd2ooooOooOOOOOOoooooooooooooooo...........ooooo................ooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOO%%woCC^^gE#YKI4 @+.5Kfs#!'{['Rg)~QPW`J+...# s{}sRWgWKsgg$.K)WgWssgKKP[{)sKsKsJh))KPK##RPIpsEP#ss42dfe2dS4=<o+2F<uO3oUdeY^dSYfe4SgoLoSSsS+shsd^Cf`)5+oEEh2Tf4ffC@2f.@+$o@ff.<2oo+25hYPsJ^f++o+3LFuu&eo3LSf==DC=&>3uwd>>FAVwu>O@o=33e33==dC==e=o3@D%uw=fo@.fYLfdL=Yeefe@25=@4Ea33%3S_Co=+doSdo=3=eS=o4=o3=3O>uOOw>;;;;>>6668886666&O3=ooS]Efo=3o=Oo4=oo3=O>&=>&&>%>OO>O*>O3*=&eC3O&%%%%%&>OOOO&=oO33dee3o3eCO%wO3Ow:1iiq:q:>*O>w11uw,uyw&,>>,866ww+o<+O@do@OooooooooooooooooooooooooooooooOOOO=>>=e%=oo@...              .....................oo+2oooo...ooooooooo",
+"ooooooo@o5@.@@.@............oooo.......................................................................oooooooooooooooooooooooooooooooooOO%%OOOO%-;>;>>w686>>;-%+e=e^C=O=o=>O=3&,,O=C..K)II_`SPIs2gR^^`YSfCCCCeS{Y44LDTf4Ye3F4oLE2ed53oo@+o=4=2@y>&,uw,,,>>68www866668wwwwww8866,>>;>>>>=OOoOOoow,,wwwwuuwwwuu,&wwwuuww8wwwwwwwww%wwuV3;>,3www3,>>wuw>w3Vww&O>>ed4oo=ooOoOOOOOOOoooooooooooooooo...........ooooo................oooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOO%%6%>iEHfgISLESYa+.+22s p##)WQQ''IPWRRK@.@@$.h[{`)IW!WKPPI_)I')`)KRWhKh)Rss)g#PsK)'IgsPhgQ#Y){[sgRCFfYCSdefeL+DFee>VDT=DeeDS@4e2f@2h42^f.5<25Cf+@o#f5S$o.SL5+SLDe+ff$ffJKYL2Lfo5d4$@@2+o<542Oe=ed3%OO=3do@o=eC3dUd&yyy>uA8uwuude=dO3e@Od=o=C=oe3dF%>&O=o@4f.[^od==+e2of2o2dSdew3wuOCF=DwO&eo%3O&3o==@&oOuOwOuA&%u>>>>>>>6666888666y&Oo34@Y[C3ooo>L4e224ooe3==;%&>&Od/DO>O>>>eVy==e%%%;;&&&=3yyO=oC+3Faed@=>OeC>>O=w>>uy>%O*w1*quq*=ww3w>&>>;;;>wut4ee=O=TE@OoooooooooooooooooooooooooooooooooO*==&>=ooo..                 .....ooo...............@oo.......ooooooo",
+"oooo..o@#f2.@@....................    .................................................................ooooooooooooooooooooooooooooooooooOOOOOOOO%;;-;8uw86>>-%%23OoC+FDO=dd3=O=w==4o2@+fEKE$gK#sahSY4ofeE2oLdeDSD2FJLfdCL4dSLCCFofC2++F+o+@+42+w3wu3&>u>,ww>>wu88668wwwwww88666,>>>>>>>>=OOOOOOw,>wuyVFFVw>>3ww>wwutuuwwwww>>wuydu&AAOy>>>333>>w>>w&3w333=eeeCe@3=o@ooOOOOOOOOOoooooooooooooooo...........ooooo................oooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOO%%%%6wuCdD`_4fooo+o$E^P^YWPKQ!gIQ}}~WW) X5.  XR`')~'QggkPQR'RhsI'KWPWPPss sQ)hgYKKKsKRR#gI`IPKggs5fSDfDed==3=C=eee3V>y^wF=4=+Ff@@fY45o2hf^L4S2fS.S)LsSfaLC@h@SS=2edKhKS2hCJL=UeodD3e2@ooe4oeCL``T33ee==Oe=3@DeO>>w>ewwVy>88%&>>dd3de3D=e=d3=De3d3==ywOeFD`ff@2aeO>O=3C445d@af+%>&>u>CuuT>3y3O=u=OO=%=O>w*&>&u;yUFO&>>>>>>666666666>%yud=&DF+o3oed=S5^)Yf=o=e>>>&,uw&U^UVwO&eSCFd%e3;&;>&%O%O&uwo=OD<dfOo3==CoVD3>Ce>>>1wu1%%OO>w*%w%CA>%ww&>>>6wtttoo@==oSS@OooooooooooooooooooooooooooooooOooO%==&o=+2+..X                .....ooo...........o................oooo",
+".oo....o@#@...  .... ...........    ...................................................................ooooooooooooooooooooooooooooooooooOOOOOOO%->--;>>www8>>;-Oo==@oLSo4Fdo<=3&>FDoSf5@fgWfSS)+Lfo5dSCd^U2LLSD4dSeFdSCf4ehLCL<@@CS244SeoS2oeo2>&%&>>;&>,w8>>wu866668ww88666>>>w>>>>>>>>we>OO=wuw>>>wyVVy>>>>3w6wwuuuwwwuuw>>6u3=>*ud=w>>33>>==>ww&%y33e43FSDUF3SF=oOOoOOOOOOOOoooooooooooooooo...........ooooo................oooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOO%%%%%%&3d+s.oo+oO=&.Ss$))`[`))IW}[{{[)Ks  XhKIjW~~'Qk~[[[|IKhKQRsIgII[)hPkPRWhK#WISggPYsYWWY$ hLPPsE<dd@@F+@F%dw>ww;uy3=ed2DL@5S+gha5SCSfTS2+4YS4S_4.h5$2sYfdUSooCd#P[`Sfpf4f==OO33=3d3OO=d==2CY3O=OyFTCL)Le2O>dO&y>>%%->wy;w,O>3o=2=d=O=33==edoOCD%%u3d4TR.$2oed>y3o33oaYYo<=F%iy6yOw&w%%OO&>;&&>u>w%%w&%V>u;wDF3u66>>>>66>>>>>>;;r8%63OdDed3o+2Fe+@ofTUeOdew3>3uweDo3F3eOCCOddO>o>>;;&&3y>w3=O=Oe=d4oo=3@4w=3TwFw1w11qeu11u1**:>wdCVddw&w>>wyxt8>C=oo@o33@OooooooooooooooooooooooooooooooOOOO&==*=+oo..                  .....ooo...........@o...... ............",
+".o........              ........     .........oo.......................................................oooooooooooooooooooooooooooooooooOoOOOOOOOOOO%>-O68wwww6>>=O2OOd@@+2a=+@SA%eSep5EL$){)SSK22S2od4dSoSde4<dddCL3fa4CS2SW52LdFDTDF+@S2JL4555y>O&yAy;>>>>>>6w>>>>>68866>>>>>>ww,>>>>>>udw%%>ww8>>;&>ww>>ww>;&68wwuuwwuuuyu>>wwOww%3wO>>>>>>==-ww,>y=CUd+++fDffd4@oo=OOOOOOOOOoooooooooooooooo...........ooooo................oooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOO%%%%%6-&O@oo2@ooeOOO.. sI$hRIIgQ~~~}~W)`gSRI)W``{'W~RW`{)I!jjsWIpWKRIK)WgI'RkQR#sPRP`RssPsKE$sK)L.SK^fUCfeD23CeCAyyFyDyF3eoe25S5ofL.eUCffo=a4<Y`h@.hLgf5SKffU@odL35D##s$XggsoCLe=DO>3DD&O3Ooo=33Ceeo>>oCdY_Lo3D3OOw;%wywwt6%;->&34+2=e=3OD3==4Y/de=oVOe3o4@S$o@+e%OO=>==O=4f2SyOy%>6%>%u>OF>w;>&%>wO8AVwyy%%u&wu&3Vy>>>>>>>>>>>>>;--7%r8O,=o2=<4@@USo243dDSedw33=;>&=3o&=Oede>o3eO=>>&;>>>uVyd>O&OOo+d==2=3OO33oTE=u1:******FUJq*uwOe=%dDy&>>8wuw6;-=o@=fd3o@OooooooooooooooooooooooooooooooOOOO==&OoO+@o.                  .....ooo...........o....  .   ..........",
+"........@ .X             .......       .....oooo.......................................................oooooooooooooooooooooooooooooooooOoooOOOO%%O;xFAt-;>>8888=FooeddDe)TeLLoSwOeO@f<4S2P])sSLdLdSF+dSf4ada=f<eC4OdLfdDJfS2L^fCf@Cda2Sd2+TSoS@=>=>uVVw>&&->>>>>>>>>>>6>>>>>>>>www>>>>>>w3>>>>&;;>ww,wuu,>>>>>w>>8wwuuuyuuyyw>>=e=O%==3&==>>>>>w;%>>w&YFoo@=Cf2T4o++ooOOOOOOOO%oooooooooooooooo...........ooooo................oooooooooooooooooooooooooooooooooooooooooooooo..oooooooOOOOO%%%%-%%%&o3ooo3oO%%8X 5SSR'PKP''[RP)W!$ WW)P'[P)[~I}[WQ`~ IhIKgIgR)RWQW))WQ'kP)RRKWPgsgRX#^$#PWgfPKK.LTsUD@JEoTV3wVyFUi3=ddddF4fLfYEo3LJoL5LSf+f@fhKS+5L$.sJa5doddf)hhXX$55a2=o3OO&>%&>%3&Ow=%o4o3e=e>oOo==oeCS%VV&>3&&>8-%t>%>3w2o+=OOo3e=2333=3Ld3&F%O<S$2+o+oOOyF%3=3@eeaFf=%;%6->%8%wVO>-8;%6>;u>>>%%wuy>>3>=>3=>>>>>>>>>>>>>;---x%;uO3====o33=o@=2+o@=O@OO&O&>%=oC3oeOOSUUdO&&&&&>>&%&>eCw&ywC3efo=2o3==doFF^U>u**11**wwdy111:*O3=3DTF%>>>;-%%-@o3@eC4+@OooooooooooooooooooooooooooooooOoOO&&OOOooo.@                   ....ooo........@..o...@    .  .........",
+"................................     ..................................................................oooooooooooooooooooooooooooooooooooooooooo@oowSFwo==o=o2+24ew>w%TThh.W)..w>=3+DY.+5XfKJPS#RgPg$5S22=SSUdCe33^TD`TfKKKsKKhfSLLghgg sXhh$Wf1O3=1Ouu>O1>%ww*=333>==3,w>wu,>w>>>>>,w>u%6w%>w;>rnt99rr99x-%y>>6w-tt6y>>Vwyyw%8=oDY+o+455eT=3&Ae=3y33e3OO@ODd=d@.@$@...oooO&;%-OOOooooooooooooo.......................ooooooooo....oooooooooooooooooooooooooooooooooooooooooooo.....ooooooOOOOOOOOOOOOOOOOOOO%%f__E_)E.fLf@2@o@$XX Wh#'{~R)`YDTIsX#I)hs)ssKjggIg!)P)P)W^KIKR'shgQgW#)`RXsp$IIYKdeS2Df4eCCLUS5S44SS3oL]]SCfdESY`IgPg#5$h)g.Sff$2SsCoDdO>>Ae3=o5Yh2@.2@=3edu&%-;->&%&>w>&%&&&%%&&==EdoLTO>&&>w>>>;;>>>>>;;y>>%yG%%%>6%%;6;>=4o2psf=OO%=%w&;;;;;;;%=>S/@C2fdC@=Y5.>%&>;&&%w6---;>>>8w8wtuwwwuuww>>>>>>>>68>>>>>>;;&&&%;ww&=>>&oSTOO-;-;6>-;;;;;;--&;>>;&&>O>STO&3>4243@4eo=Cd=eeF=JC==%u>>>w^EDddSw>d>>&>>>O>>w-8>=2O@F[Tee>>wO;%>O=Oo=3O=Ce=oOOOoooooooooooooooooooooooOOOO@@@oo.                             ...................................",
+"................................     ..................................................................ooooooooooooooooooooooooooooooooooooooooooooOO=3wewoYd4@4oeU&wu&=So$g_Lf@eF@3=@F5fR$XhghPW)EsYE@2S<=DdDuweO3e=dS2$+fgK#gKSC5YESJsR#I[`hhS=3ee=13wi3UV*%O133e>Owy%uuy%&u;,>&&,w>>w&>>;wyuyn&&w8yn9ZtuAFw,3-8u8>6uVVw&,>>3&@T)^2@2$4eaSO%&yd3wwOoOoO=od3eD4Sp4..2.+@ooOOO%%OOOoooooooooooooooo....................ooooooooo....oooooooooooooooooooooooooooooooooooooooooooo.....ooooooOOOOOOOOOOOOOOOOOOO%%^`4o+f.+..@..f<@  sRPgQIg)gS$sf5# jgsjK'[[g$~Is~IKKRP#sK[`KIWWWjIPIk`[`I'RSKIIPRDdDdLDff2254Sf5@4EfoSEL3@SfoFSLYs IR$g_^#5gfY+42L42Fo3w>>>DC@SJpRP.++L3o=ww&%---&%%&>>;&%%&&&;>>2=LD=AL*>>>>>&->;>>>>>>;-6;u>wF;,OO%;66%wy=42.p'^4@3&O%%>>;-;;66%3==FoeO=S^Y4d@fw&&>;>>->>6666wwwuww8w>-wwuuytuuww8668wwwwww8>>>&&%%&>>==O&=O3de;;-;;;-%;;;;;;;;%&;;&%%&yuo>y=oYLd<@3aeOod3OOoO&23323w,&;>TLe23DUdd>>O>yww>--u6O=o4SDU&3e3wVyu%Ooooo==eee3@ooOOoooooooooooooooooooooooOOOOO@oo..                             ...................................",
+"................................     ..................................................................oooooooooooooooooooooooooooooooooooooooooooo=OoOeeS=UEL+<hPdoOOiDd2.)E+2oo+f3@d_+L)JgsKE`QYK$sS54L3CU3eeVSAD32F5sESgR'_IgDhLQYh5KQgK`]L.2e=LEO1JJU=V**y*13o=wO%w=FAiw>,wwuDDy&ww%3u&%yw>A=3DUy&wyyyyTT3=OwOwyyV>O>eedC3o&4f.o....o+22@&&&OoO%OO&OoeOdeeCd^L.fYSS.++@&OO%;OOOoooooooooooooooooo..................ooooooooo....oooooooooooooooooooooooooooooooooooooooooooo....oooooooOOOOOOOOOOOOOOOOOOO%%.oo.2..o4#L^#...YWYKs#PhW)Ip$RSS))Phs#gR~ggk'hP)jQQksPWSSghIRPPKRIh`[gI$SggIKRKhTD2Y^2S4SDfoCC242SsfaDSeS+=So@4@5KE#sKP)Y#JL4@f$$52C3=&&wA3DLf5.sgpoo2+oO=>&%--%%%%&&&&&%%%&&;&&ooeFOo3O&&>>;->w>>>>>>>>>>%t>%u%w&-;---%%O%==4E]E@o3O=w>,>;--;66=3=O>ow3O=DJad2Ly>&>;>,>->www8wtwwwwwww>uuutttuuuuwwwwwwwwwwww86>;&&&%%&e=3O3doo-%%--%%--;;;;>>>%&&&&&&*O3>OyUD32ooo=o@=2C=3%Ooe@2f23%w>,%33eSdd_LdO*>uu&>>i%&&V3+e=e3=O%OOO&Oy>@OO=d3Sd==OoooOooooooooooooooooooooooooOOoooo...                             ...................................",
+"................................     ..................................................................ooooooooooooooooooooooooooooooooooooooooo+oo@&OO>3Oe+SDEYI`_YLLDDaf$)h@+=S^E<4oLfLfs^YffQh5#s2S@oC3CL>wuA=dedd=4SY^LY$R[KC+hsfg5RsP5hYS++3=o4i=oe3OVAwu%,43=&3deOw3OVdOVVOyu&yUUV>Vy&33eude3<eyeiuw=e4O<23OOOO3wd33e2oTE455+4fssf++o@=3%O&OOOOoOOooCDUd4FYLYE^PhSooooOOOOOOOOOOoooooooooooooooooo...............ooooooooo..oooooooooooooooooooooooooooooooooooooooooooooo....ooooooooOOOOOOOOOOOOOOOOOOOO2.+o.o+.YSLRY@W)]W)'ssWWRRhWgh2f)[h'))sW`##ssIP`IKWkIKgIKYKPPPR~K`WRsgsgKKKKKss5<oTJSS++UL4fTL+@LLo254ofea@d+4SSpWYsK$spLS55S.f+of5.3==VOwdofS.2.<.<o4o%O&&---;-%%&&%%%&&&%&&&&%yeeF3>>w&&>>>>>w>>>66>>>w>%w;O>%OO>w;%6rt>uoo@hf3o@&owiu>>;--;;63>>>3>3Adoo==do3u>;>&;>>;8utwwwtwwwuuyuwuuuuuuuuttuuuuuuwwwwww86,;&>&%&3>OOOdDVw%%--%%-;;;;;;>>>&;>;>>>&yO>OoeYdO=deL3CUeeO>==O32<43e33>&yy3=C222dLd==3=e&O&>>O>L3==dO>=O3>wwOAuooo2f+S=OOOooooooooooooooooooooooooooooooooo....                             ...................................",
+"                ........             ..................................................................oooooooooooooooooooooooooooooooooooooooooooooOOOOOwe+dFD_sY{{_U=o<$@hK2Laf^doYL.os5.o5Sp.f^$5@o4ed433>d>>Ow=DF@FHs$LKhsKKSLLRPsphJRPY4.#gDd=OCe**dw%V&uwu=3o@Fd=dd3wFV>uyyw,wwww3>DD=OdUe@f2<LUe=w,4@o24CeEES=o22df+fSEf5CJESpJS4EDooo>O>==OOOoo+OoY^EFd=fU)YLSSK52oo@o&oOOOOOOOOOoooooooooooooooooo............ooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...oooooooooOOOOOOOOOOOOOOOOOOOOoo+.+2+5.s5SYKWWLsg)R[{[Rjh)W5SLs`I)Ig$WWI'sPPsghIRsRPggW)PghIPWPRRIkPRWgWWhRKYpo3=T^STd2Lhf2.fhLK245J42SF4+$.Y'$ 5X#$SI.sPSLE$5p@SD=e3=COw=4oJY45o@@3@=O%&%%---%&;&%%%&>>&&&&&;d>>>&A%O,>>;>6>;668w86>>6>%>>>w;=%>u6---%-&Odooao&3O&>%,;>;;;;;;;&;>>3&V3>3=OwoO>&>w&&>>6wwwwwuttuuutuww>6wwuyyyyytuuuwwwwww8>>>&&&>>>3yDwO3>%e3%>8-%--%>>>;;;;-&>>;>w>&%O=3yo&==oOOD33Fd%3=&=3O=OodCd>=&u33@4@=33d3dLUDdSCO>wu&C=OeeO=OO=OO&;TT@o=dDeLeoo@Oooooooooooooooooooooooooooooooo.....                             ...........................        ",
+"                ........             ..................................................................oooooooooooooooooooooooooooooooooooooooooo@+OoOOoOo=4o@@5`K$`L=2+.@@5LoL4Lff.44f5S+ffo2LfLDh+fS+dSFd>wVwwe3=de2dd4@psspsse5DEUs2sSphJKPSfD4LS3FEio3uL1O=*=UDef@oCF3LCwC&>;>w>%O&>TLDe34ET$YL2p4@e3=Cd44@eo]`^`)S52@hRsKY`^22..2.$_Uo+oOo&ooooO@=eUTCF=3SC5Sf4hfY5KSoo@o=OOOOOOOOOOOOOOOOOooooooooooooooo........ooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..oooooooooooOOOOOOOOOOOOOOOOOOO+o5LEYEEPIIKKKhIgsgPW`{{RhIsSW^fI'PXh))gs)`RWRPIWPR)KKW gg#sshsgKgRWRR)g#sKK)LEYdC@odUT4fS+LD<f+$.fS2LLe4S4LhLK.fYYWRsYf$pY^K'hLP.S5oo3ewSCSFf{_=dD+3o=%%%%%%%--&;>>&&&&%&&&%&&>>>A>&F>>>;-->ww6wwwww8>>>>>>>6>%=O>u;%-66>>wd@+dO=&O3=O,&-;;;;;;&>>O%>%&O>w>%d33&%>w>&>>>>>668wwwwwuuuwwwwuuyyyyyyytuwww666>>>>;>>>w>>>ww&O=%%d%%%%%%%-%;;;;;---;>;&>w,%&u3O3>=O3OOOS3O=e=V3&+e+@3eS3>>FF=o33=+44+de4<4deDUye3FTES33OO>OO==33%wOooo+e@e+O@@ooooo........ooooooooooooooooooo.....                               .                ........        ",
+"                ........             ..................................................................oooooooooooooooooooooooooooooooooooooooooo@=OooOO==Oo=2h@W)s'Q@4@@2fIs53+L$fhR2hSo+^_3=F=SSf452CYCCDCwuyySSedCdfffDKLKS$_^ffffSSgpgYLghf$o@@o<FF=e=*1>1e%4_^2o=ooOoe=Oddyww&OwAeoTC4CL2UEgE^TLf<<e<3<=oo=+<Y^E`]hSPPKE_PgE2fJYh5PEfo+Ooooo+ooOoo3CTeee3334242ssRgKS.ooo@o%%%OOOOOOOOOOOOOoooooooooooooooo.......oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOoooooOo<L]L5fP)sRIRKIsPIIgR#g)RWh)gSghIWRK!'P#gQk#)KRW~'kPWPIK')hRWP`KRRWRIIsKPSPggKYEYCL2@d+U4^L4.SY@55$$ff.42JoL4@5WhSQ^YSPh#Jf^_LEEQY^fEdfDFdd34+LS+CeDwVOO&%%----->>>>;&&&O%>>&%&;O>A8->>w;>>;6wtuwwwwww6>>ww;;>>y@oO>&>xFw-->O>e3OO&%>>O,&&--;;>>>w>-uw>%w>%>>y;&>%&wwww>->66>;6ww>6utuuuutyyyyuuyyyyuwww666>>>>;6ww>>;&%&3&O%>=Ot%O%>-%;%----;;;;>;->uw%y&,3>=w=*3wwCw=>==3&=3=e@dSC=+dUDeee=o2fYe<o=+++e3=3C3dT]UeVeoo3=&O&O==O+Oo=e=@@@Ooooooo................oooooooooo......                                                ........        ",
+"                ........             ..................................................................oooooooooooooooooooooooooooooooooooooooooooooOOOOo&o=ooL.hkKh{L@44.IR2Y+2.YY^foo2o2FU++o34Y5o4Doe3odA,3u%dL3CD2fSLL+hP2SsDS4FsS^DS$L_YfWp244f24==e2Le3Oee<4@o==o<++o3=oDCOwVy>&=3o++fEfSS2STYd=,<Ow>ee3e@$@2X.$X$sP'RJX $$Y__`)ERL@.o@o=oo@oo@oo4d3d3deeedY2sf$'gSS@++o<o%%%OOOOOOOOOOOOOoooooooooooooooo.......oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOoooooo2ooU_SLLS5P`hQWs)KgKg_!KsIWsgsILs#Rg'Wg#Wk$IRKRI})hP)IK'RPRs#I[KRWK)g#sgPg)_gYSYSSfSS4@22Dff2+pSfpfpfs4LLf222@_'.$.YW.@h5$W[_RYfJ_E2Jf@33=@=33+o=>=Ad3O>&&->>>;>>>>>>&&&%>uuw&&>u--%6%w-txxw6688wwwwww6>w66;>wZTUeoO&>>-tFw>%&Oy&3V3O,,%>&--->688-%yDw8>%%>Vw;Ouw%%,uyu>>uxt8;6wyuuyyw8w8wuyyyyyyyyytuww8886>>>>%>>;>,>&OO&O=OOTUuO8y-O;%%%--;>>>>;->uw%%%ww*=>O;>%O%=&>=wOOCD=Do2d2fCDCC==@3dLC2o5+2342df=332=LD&e33>3oO*>>O&O%ooo=d4o@@ooooooo................oooooooooo......                                                ........        ",
+"                                        ...............................................................oooooooooooooooooooooooooooooooooooooooooooooOOOO&oOOo@+@X g{{(shP^W555eDf[`)fDLffoCU=O33fSL)DC+=>e3e=uOu=O3d33@LTHH4<sCESeSSfCf2pfYELhJRLLE4+h4Y_)S22dFd.2..++@o@o@+o@O2,,A3wO=dd+44f_L+d@2oee,&w>Fw<===KS#$5s P)W|I)R #E52 PES[S..5oo@=LCooo@OTLCedVdw3DD=SS5LY][Eooo=oOOOOOOOOOOOOOOOOoooooooooooooooo.......ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@24fT_EgSXshRP5KRERIgPh#RsP##h#kI)W'QIW)')KWRRsK)kWRshg5XhhKKh.gSIPW{PPKs#R_5SCeDD=Ce<f4TE2@+S@ SfS52.TY.@S5RPY)`EYfKY$sffhff+ P_fS+2TFeSd=oe2w%%w>uA%O%&ww;%8&,w>>uyuOw>%>>&>6>;;--;;wxnt8wwuuuuw86www>>>>>uVDd=*&&--%->>;->>>&y&;%>%;&;-%>>%%ww;;>;>%>6>wZVwuF3u%wyw8yZxw>>>wuuuwwww8wuyyyyyyyytuww88www>>>6>>6ww6>>;&&%%&>3Vw>wu6%%-;>>>>;--;>-%%&>;;>>>>&%&;>>>,>=&=3O2D=34f=22oD@dS@3odTTe2SSL445dS4=eeeUu>&&=>=O%%OOOOOO+oo452eo@ooooooo............oooo................                                                                ",
+"                                        ...............................................................oooooooooooooooooooooooooooooooooooooooooooooOOOOoo==@@@2jIP{{SSh2WERESCDpf.$SfhdFD3Ded=%4@SUf=CeDew3%uwdew1F>eS+LEfSdd)E^=e+<dS4fChJhfP#.KES@Y^ELs+4S2oo@.oSE@+ooo@o@oo2&%Ow&e2oo@<@2^E2ie3iw,wi>Oi,d<3=JK$  hgP)Y hQ)WK5$ pXh)PX@@@o@o^^.o2@o<22@oO%OOO4YLLa@SLE^ho@o+oOOOOOOOOOOOOOOOOoooooooooooooooo.......ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo+@@@oo@4s_)'WKPWPI)QgPIgRgXKPg`RQWjRKWR`[PW`KgQ))QjKIPWsfs^_IsKRghKKPR'IPKIKRYL44D+fSSfdf52fL<EfpIYf.$of22C4hs$#ofg@ShSSg.EY..Wh_)h+S+<SUf3=e33@>ww&%dD&ww>%%>w3FFy&O>uy&,>;>>>,;>666>>;w>--8yywutytwwwwtw8>;-;83=%&>;;;;>86>>>w>%uO%u&w&O%uu&--&;&%&ww>V>%>6-%;,>Ouuu>>yVZxwwutwutuuwwwwwuyyyyyyyyyyuuwwuuww6666>6ww>>>>>&%O%%&>--6w>->>>>>;;;;;;;----;>>>>>>&%%&>,w,;%3O3=oFLT`Oe+<3<=2Eo+C=OYSo(U+5eTFedd@CC=>>>==&%%&&OOOOOOo=o4CYLo@ooooooo................................                                                                ",
+"                                        ...............................................................oooooooooooooooooooooooooooooooooooooooooooooOOOOO&=oo@D_QP[WS<2<YP.fYUSeofYLfo@o22d]D3we2f=2@od2L==3w%O3=3o=eSLdL3FTHpfCT_4L4+DUSY@s`PhE5Ksh@ff+#^E4@f2.$S5CE..++.=+o@@o3e==O@of2fo@s.24=<e3>u>,udi33<4+XsjW`[`WSIXX$$)`S@XXP`Kg L$.o@=o+.42S+@o@ooOOOO>CTYS25SSffo@+oOOOOOOOOOOOOOOOOOOooooooooooooooo........oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@@@o@.YIRQ)IgYYs#KR)IPRssI'WPghKW)W IhhgQh#ggPKhhhXsh5^K)RIsgISWW#I KPPPLLCUCdC5TfdF+f4fYLoLhsL^PEJ@@a@^)fh5P2..pEf.5SfLh552pIfSg.#2Caa3@2oO3&%%w&&u%OO>u==>Oyyw%O%>>w>ww>>ww8www6>>>8ww>wyFDyyytwwwwuwww>-;>&&>w,>;>->>>;-;>i&>%ATu>wO>VV,&&&3VV>wywDu>yZw>t>wuw>w&uwyxytynnuuttuuuuuuutyyyyyyyyyyyyytuuuw6>>;;66>>6w,>&%%%&%%;w8>6u8>>>>>>>>>;;>>>>>>>>>;&%-;>www>&O3O=3e=fdOdLodffdffSY4LCSfESaDde+2eodUS=&>,>*OO*=&OOOooO+ooSd^Eo@oooooooo......o..oooooo......  ........                                                                ",
+"                                        ...............................................................oooooooooooooooooooooooooooooooooooooooooooooOOOO%Ooo<@.C#XK@4fa.E]PSYLfofaE_fSd3o+3^@2CCe[55L@eS=ee4ed=O>eSCe=OD3=4fddCedY43D42F@5LfLJKQPY5YWSXpR_R5h)5EPSh$pp__+S..sso^_=22CC+<_[^fSsLSCo4@=i3U^`^L+fg5R{QR_`'hI X544QE5.ssghs'h#Yf4oed.5L24o+<OoOOOoO=2=+oo.@24=o=OO%%OOOOOOOOOoooooooooooooooooo............ooooooooooooooooooooooOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.ooo@=+o+.E)ghQRI_gsPssI#P#WPPI#KIWWksKj$#gIPIXRR~IhK#KW^5gK_IKgKPKs#IKKKRPLYL+4doS)CLUdCefYS2hS#..fJfY]L@45^SSS<fhaS$+ps4.+hKsgIh$KsLE522+=dCe>y;%ywO>>Td>wOoO@OOOO%&>>V,wy>>uwuuw>>>wy>w,&%&uCytuuwwuuwwwuw8>8wwww>>>6-;;-%%%-O&>O&AO%&%;>&;;%OOwwO%w&w86uVAx6&&,>uy%t8wtyyxytwutuuwuuuuuuuyyyyyyyyyyyyyuuuw6;>;-;>;>6www>>>>>>>wuwwwywwwwwwww86>6www>8>>>>;&&6;;>>>>>&uo=3=oeo3T{^o@fSL4do2==LLCfU^Yfe4ee@TD&;>,>%OO&=&OooooO@o5LofLo@ooooooooooooooooooooooo.....       ....                                                                ",
+"                                        ...............................................................oooooooooooooooooooooooooooooooooooooooooooooOOOOo%@o@os)#IQs<o@@$S)Y__@^S@2D5^C@2oS^@S^ESdYFo+oe<@+fo+3eU=dd%&yHCDd3idee2FLCD3edFLL@PRKggKgR|g#KgXXP##PPS@SgP.SE4SfSYf.EYSSSYSS^SDSLLY)af54Ed4oELgfWWgK)R'RKgQ)`s4@o+f4_IshKQ.5'[SYPQYS=$SfS[_+o@oooooOOoo++@@o2=oo%OO;%OOOOOOoooooooooooooooooo...............oooooooooooooooooooooOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo2+f`III#ghgKK$EKRhIhRKPI['~PWQgkI#KIIK~PX#ss)KX))g)hsIREssPRK#PW)PgYH<C4ddUUYfFff2LL2h4+LY+d2)Yo@o<+2f#4fF2o.+@+.oXs5WRII$fLKJs5=2eeDFOyy>&%>y>)Co@oo+o%%OOO&wuAwuy>>uu>66>6wyVu>OOOO%%wutyyyyutuuyyw66886>>8ww>>>>---;wDu&%w>y%&>;%&3>C=%=>CDuO>w>uVu%wO>VTUuyyyyytuwwwwuuwwwuuuwwwutyuuuttyyyxytutuw>6;-;;;>6wwwwwwwwuuutuwutwwwuuuwww6>6ww8>8>>>>>&&>--;>;;>3OeDo+Fd&o^EdfYf2ade=F=FE23f<=2dFdD=SFF3w>>&%%*&&%Ooooooo@o+@o@@@ooooooooooooooooooooooo.....       ....                                                                ",
+"                                        ...............................................................oooooooooooooooooooooooooooooooooooooooooooooOOOOOOoo+@2Tsj_YofCSSo$L)YUYo@=o2Yae==+==oe)LDL(YSfSd5Y`SCF@^DOO>OeO&e3iDC<ddL4dFdddSesgg$hK)PIIgsKWhKggK#R#Q'Q5Y)s5E$gf+.KY.o.2@4PK.@2@.fY.so$L`YP@5hhh)`[[gKWRsRWQ .$4CSeCSL}hXJQQ_)h#oLS@fSLLPL4o+@OOOOOOoo@oooo@OO%%%-;%OOOoooooooooooooooooo..................ooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooo.ooooOOOo+. __~gIL^_Sgss_'sIP``I!'~KIP#K)[W~Rs#KhkP)R)}g#SsKW'RhRW5RIhgKIPgfY2F=D^SFYDdDFTS+4Eg.SD2L5@4@o43of2o4Sfd4=.o.@#@.s.IS$hPhps$h+dDSo=d>&>&wu33=2oo@@++o&&%OO%>,Vuuywwuu8wwuuw3>>&OO&=3e6wyVAVyuwwwuyuww6888wuw>w,>>>>>>wVOO,wy>u>wu>&>w3==33dd&&>>>ww8>ODUyVywyyyuuwwutwwuuwwwuuuwwwuuuuuuuuuuuyyyuuuww86666>6wwwwwwwwwuwwwwwww8wwuuuww86;;68>;>>>>>>;&;;>tyw>>&%VLdFf+3eYefJgY]hL<33UD@+3T^e3e3CD=EuuFw>&&&&&%OOOooooOo@oo=ooo@oooooooooooooooooo@oooo....         ...                ..                                              ",
+"                                        ...............................................................oooooooooooooooooooooooooooooooooooooooooooooOOOOoO=ooo@LXp{{TDETL5sg5DE2^df+3oo4+4++4+o@LfaESJ42fYELoCU+3d13C%33oLO=3oCo3eL3DVd^YfSYIKRPIKR'))~WWK`PgssgfLKY@KSLS.+.@gETsK2..$5p+.o4J+LC hfYKW^)[[)!W[{{`'Q}P#PXfsd=EU3*s#sK'P$ 5JhYU^SUY^E5.o.oooooOOOO=+oooo@oO&&%%;%%ooooooooooooooooooo....................ooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooo..oooooo=o+.gIIIYJ$ghfWSP) R}[|QWKW~hhRIW{{~)'PW~`[I# WEKS5hKhWKJsgKWRIPWIg4SpED3JS=eeeF_D.<SYoWLLSCdoo@=oo=o52s4LS+o@4J2@2ffsQsKKgKSSPghSDD3eeuwuyDD3==oo=@oo@+OO&>>&&%wuuuiVuuuuuyu3%OOoOOoo<duutyVVyyw88uytutrttrutw>w,>>;>>>O>ww,%uyw>>>>wuw=dSCdw3=&&>>&%-8w^^V>>FDuutxyttywwuuuwuuuuuuuuuuyuuwwwwwuuuwwwwutrwrw88wwwwwwwwuwwwwwwwwuuuuuwwww66>>>>;>>>>>>>&6;8xnw>>>de3DTdd3DSCd45))Laefe2=dU+d^CCCwd3^ee>w>>;;;&%OOOoooooOo<FL+o2+@ooooooooooOOooooooooooo....         ...                ...                ..                           ",
+"                                        ...............................................................oooooooooooooooooooooooooooooooooooooooooooooOOOO&Ooo==@fg|[Eeeeo+@spo5odT@d3o4doo4@DD@dT4sL552<<4Ds<5+aSDO3>33333o,33ewDFeOUVdFFD4DJKRJKkWIW)[{[)IKWIhII^PPs5J)Lg@o#.^_YSSWp.@of2oo.SS_fKfWs##K'`'RWR'QWRPW'gX#f55YUFDOV)RgWW #K|^.QL555$$2.@@o+oOOOOOOOooo+@ooooOOO%-%-oooooooooooooooo.......................ooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooo.ooOOO=o@+oXg)!sPKI)SgIhhsPg|KR`IWRg[WgRWQIPsWK#QK#XXIII)ss##$hSPPPgRgQ)Kg$pSCd3eY=CYdFUELhL@2EfDLo43oOoo=o2@LCLLefYC@LshESES)WgpSQYLf)hSdSCd>yuDFyw=>O@ooo@o.o%&>ww>>>%uuuAAuwuw,www=O3&ooOO@=Vt8>8uxVVyuuuwww6rr66wtuww>>>>>>u%u;>%>w>ww&wUTD+ed3===>>yVu&->6uA>OA>yAxVADAy86wuuuuuutttuuuuuuyyuwwwww8ww>>>wuxttttwwuwwwwwwuyuyyuwwwuxyyuuwwwrw66>66>;>>>,>>&6-;wt6;>;ydO3L==Dd^Y=2h4+SfFUe4=oOSU_L=3&3>UDO33&&>>>&OOoOoOooOO2ffELfoo@oooooooooO@@Ooooooooooo....         ...                ...                ..                           ",
+"                                ................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOoo2@f^#''$.2+UO&wOOeO=Lf+fdEDo2OO33d%V3=4Sd22<22Y^d=e)H+@@@5#5K54+wyyZC==Cd5ff4s#RKhhPRPsRQ'{{`sK[)h)_W~skIWgR# #g'WQRS5K#@X  sRh#!RQ#ghg#5$sIPW_RK5KWS#h5s##gIRWP`sofgPS 5PLY4T`[dee2@@@@OoooooooooooooooooOOOO%%%%%%OOooooooooo.....ooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooo@.@...+....ooo@oOo=oO&OOo=o@^){|gKhQghPSshhss)Q$SSRIh'WPWEo5IR'IPK#+5opY+=S3*1uqfg2s2f4WK_`WPsXsHSL@fCEYLTY5F@foo@++3O%%%-%&>o=UWE4$p++.o2L_WKWQ#EKRPYhE$#fpsWhLTFue3&OOooOooo+=O&>wyyu8wrttwwuuvttye=@ooooOO%6yuuttttuunDTy>w,&wu&w,>uw,wd%uu,>6;;wr6%6A;%u&>UTy&OO&==>3FFu>>>weC%w3wVeV3FUde>3tutt8-6xtyuwtwwxuwwwwwwwwwww66wuw866wuyxyyyuuutyiyyyuuuuyVyyVu>y8wttwwwwyA%8w;Z;,%w*w>>wuuuu>AD>CfaS.4SShLe@FSwCYddLo<@d2dDwwOy>=f4hdooo@ooooO=o@o2TYL5..$ooooOOOO@@@oo...      ................................                                                ",
+"                                ................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@@ooJJ 'Wg#.d^DOO>wTD%455S2Fe+oCTCO>wee=oSS2o3=ULoLFoCLo+YY.gh)`p33>>6==^F<SS2YsfPWKgPhRIP|W~WQQIhKKsK)PP~'[WK #KPRhQ~IhQS XXs)'K)''IjRIK)IYWYRRKsgIh))^KRRKhRR)hPETLa$#.pPK+.^LLY=o@o@@@OoooooooooooooooooooOOOO%%%%%OOooooooooo.....ooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooo@o@+@..$o+4oooo+o+o<OO=OO=+._Y gW)WsKgERfKssI)K hPRh#'Ig))EposPW)W[J..@o2eo33O13fs524sY5hYPYP5hsL22EUS522T_4oSHYKK@eF&%%--OO&+fEgSo.<ooo@o$Jf$h#J^LLL5LPs$g5PggKCdiu&OO3OOOOO+=<=>wuyyttrtttuuuylttye=@oooooO;wuttttttuu>uy&%iw>,>u>iu>yy&iw,&wy%rn->6w>%y&O=>333O&yd&O&=>>3w>>yDECSUDydw%dOddw386;-;66>%wtwwwwtyyytuuwwwwuww8www866wwyytuuuuuttyuuuuuuuuyuuuw,wwuttuyxnwxyw8rxtw>ww>uwAyud>uiLudU4fSC2oLC2=o3AL`CF=LESCd^FeeA&wSYC4=o+oo@oo@oo=+.f4YEgW$.+.@eo=OO@@@oo...      ................................                                                ",
+"                                ................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooOoo@oCC#`WX.@)^y%uwOdwO+o)_@2o=e=3Od3%OeeTd@@==24aCSTeO4eeL)2ghsL`SwDAnC3deEY@SKsghRRKKIKWW)I)I'~W)WIKhIK~)`R)s #W#IRhQKIhg#$XI)WPhR'`W)`W`^RRW`I#5WhSPKPhRPRRR_'KW$23=.#@hS.$LUoo@@o+o@oooooooooooooooooooooooOOOO%%%%ooooooooooo.....ooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooo+.@@...++oo.+ooooo@2.$2ghg$jWWIsKWsPs5Sg'' Q(##!k!'h5HU`hXk$h)[R$.$oofTde*O4oYQs+$sJKKPWhsRSLd5fS4g5sK44Y+dY^=oOOO-%-%&>oo=o5oo+oOOooo@o+LQ5.5fg@hWf(_WJ@55=w3eCeOOOOooO@==3uyyyttttttttuuurtvxe2+@@ooO>uyttttttuwwww;>>FVV>Oy33O=>e%,,de=,>&OO3>OO33=ede=oOOyDLFFD&%OO>&O*3D>VLDeV/`TLLdFCtxywwyt;6tuwtw8tttytuww>wwwwwwwwwww668wwuuuuuutyuuuuuuyyyyyyuyVuyyyyyyyxyyDy6v6nwuuV>u%wy3edi4FddC+fYLfSUf223OwFeoC+LLfLECS^V%Vwffooo.@o.ooooooo@#KhPW#g)PPsKJ+@+@@@ooo....     ................................                                                ",
+"                                ................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooO=oo2oLL KIp4dEwO>>>uA%>oeS_]_Do+eLdeCTU<_)dLD+52oedYF=Oww<S_p+K5Y4dd>DT*UiSDYSfLLKgR)QPPPR'gP|Ik)II)WR)PIg'WW)XX#R#RIIW)Ws)P  KWKW~~{})gXX XX SPgsssssRQIQsQK )[IX2.@oooo.hELf5@o=o@o@ooooooooooooooooooooooooooOOOOOOOoooooooooooo....ooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooOooo4.+hLEL52fSso#.2f.+.$ I)PWgjPj``WPX5SE```'PLf5W'~)h.+o<h[[[_ssK)^S@@@=3J/DLCf@SPf#fYWIPEhgK2LYDS55LhLfhfS44oSoo&&;%%-%O*oooo=oO&O%&O=O@o.+2YPo@5fLhsK5QYYSSid==FS3=OooooooO3ediyuutttttuwuulttyy322+++=wyyttttttrwwww>6-uuV3&iwdD^wOeeO,>O3&UD3odd22o3Foof2wyu%OyDUudw;wy,OOOowOO>=__O3y>Cd8txt868wZw-6yw>tuutuuw>;>>6wwwwwwww>>>>>wwwwuutyuttyyyyyytVywZFnttxnnyttxyDy6n8ZAVVVuAADFd4TSddDedfY_L.)^5deeOVO34=4e+f_o5do44==42.@+..o..o@oo+o Xs)``sKW`)P^ho2@@@oooo.........................................                                                ",
+"                ................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooo+oo2(hgY.2.FC&>u&>VD>>e=OC^)S=o=UU==D4Y)+dTS+3fed=S33dwieCU55sfJdoeUw8SE1JS4SYIIKR)WRPI')KIPW)!gRIskghW)IR){I  $)RgjRWW[PIIs PQP)[[[PX#sKRsX'I#)sX#S)EQRWj)KW`# 5o=O=O=@@odS3=o+=ooo@ooooooooooooooooo.ooooooooooOOOOOooooooooooooo...ooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooOoo=o@@L[YYYSS^{_SIP``)_)R)'RR'WKhh)`K)IY]`YXI[{)^[`I  .@+oo._gKRWWhh)[L.@++o3^T2TL.2ofKh$Kf4RWhshKYhYYfhSfYLfR)L+ooOOO%;-OOOO+=O%O%&O%%O%OO33=@hEh4..@@.5fLEYR^E^/UUCOoooOOOoO&&3eyyutttttttuuuvttyuwed@=333ututttttrrwwwu>6%wu&U^COeU3Fe=O=i=Ooddo@+4o2L``LfS@O3u>%>&O3yu>uVu;3>&wOO>>3=y&d>=>yw8w6>uAtt6-686wuuyyuw>>>>>>>>>>6>>>>;;;>>6wwwuuyyyyyyyyuuxywVAytttxnyynutxwuVZZywVwyueyCC4YCe5S<E^Dfhf<+24dEDw>CS=d42s)E@ffea@do5+..oo.o..@o.ofhgK`'WXgKXgQRIY @@oo............................................                ........                        ",
+"                ................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@oo=U<S)..o4=Ow3>wO>>%&3=Fo=^UdS2o3odE_$4fS@4d@OU)CCCo8^DCf4foS<SCSdDiSEeoJSSYRRPKPP''RIKWgQ)RRkQWIsPIP[`P'{RX# )[`'QKI''Ig)QI``WW'Q`{`)[{[RR{)[)KW`}K!IkjWQ{s.#.o@o3OOo=o+3oo@@ooo@o@oo..................oooooooooooOoooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooO%O+@2K^K5P# h.KsXSPP$S'``)h##K))QQjRKIs)P .2$#K__Q  5 Xo+o+oK)sXWR'Ps))....4o+2eST4<4+aS4Kh5SRsYgKLSgLK_g@gh#SR2o+=3&&%%%%%OOoo%O%%-%%%;;OOOOoO@o+eUS@4+edo4L^_4HYTETTE+oOOOoO&oO>wuutxttttyyyyxttuwueC+3ew3ututttttrrrxtu6x>y8=<F@deo+C3TEOodFDdSL)fh@5KPL5..@w>&;&&>u%%%>w>&>OwO%3y>uDyy3CLF3Gn>8twxF6DDt>ww6wwuuww>>>>>>>;-%--;>>>>>;>>6wwwwyyyyyuuuyyytwynuFVyytttntn8wtyAyVyDVAyyeedd4e+ffF^CSS+ffLDa4=eeC/LD33SS^RL)f45oo......o@.+..2..R'`{)$Q'`WIWPKh#$o...............................................        ................                        ",
+"                ................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooO=oo=@2osL4o+@o33;O>-ut6>u3>ue>Oe]`LEd4TY5)LY5eDe3DSd@d3A/FDLfdC@HfDSLdu==DfSSKh#KRIIR~KWQPW`WIK~'PKRK'RhI~WI[)  Xg)'hR{P'{[}`RIW)sPg#K}'KRIhPRIsKhRS_[WkIkI[{'sX#.@=OOOO%;OOoo=+@@oo........................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooO>Oood^_SKIsQ^sLRhgPKfhR)KP)hXRghQP#)R$)`5.#..@.o@os. ..fK)Y2EfRj#kR) h[K $$...2o+@ELSSd2YsYY#Rh$W`Kg$s5fsSKhPI.+@2ooO%%%O%%OO==%O%&%&%OOO>>%OO&o5oodoLd@=@44<oe++@=dDT^i=oOOoOOoOO&>wtttrrutyyuvttuwweC=edewuytttttttrrwt;6w>u;e=3CSeddC3LEieddfLET^SLs42.2f2sJ>&>uu&O&ww>wyw&>%w&%>V&&>F>Fuyy&Ft;;6>6wuDDnwuw8>6wwww>>8>>>>>>;%-;>6www>>6wwwwwuuuuuuwwtyytyyuyDZyxywwyyAyuwwy,wuAuwdCDdff4h5SJDD2YYLUfeSd=dedUUdDdCh$.oS^.p$2.+..@@..+.@..@5hY'I'`g K'Ksh$ X  ..........oooooo................................        ................                        ",
+"                ................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooo+OodC.SE_LoECoOAw>w;%t&w>&>=3eODUfTa4o5hgL2+L43eO3<LS=&%u=3LHf3oSLeo3ee3=dSffIIIPQI'RsW)RIRRPIR'Wg~W)KQg`W'{WXX RI'W~)P'{{'Q)g   XhWWkQsPPIPRPQIKs$PWRh'k'{{`#X.<oo>O:O;OO%O=ooo@o@.@o......................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooo%%O=o.)[5)IhYgg_YpgSh(KYWW')s IhXXkkRRKJ`S+@@@o==O+o+@.@sSTS@ooSg~RPPgKh`R ..oo.+o@=FETF+2YSKRS#hKghhYKsPPKS.KRXo+o@@OO%%O%&ooOOOoO%O%OO&OoooOoo@o@ooOLULYe+4aeo4235<2eiHiOO&OooOOOO&>8ww86wuuuuvttuwwed=wewwuywrrttttttwZ8y>>ww@iOLST[Ui4o@4Cooo2oooo3ef5=3@2SF%&>>>www>yy,uyw%>>yV&FDyFww>V>O>->8w8666uw>wt6>y8wwuuuww>>;>>www;>>8ww86wwuuyyyywuuutuuuwtwuVywVxwuVZiyywnVy3www,DTEDS33e42hS5hPLf@2CE2=FdUdLOVy>%3S=.+.@@..@..o.....@....$o P^hI)jjIKgPXX XX X .........ooooooo................................        ................                        ",
+"................................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooo+oo2oEh5ofDo^L%Od>w>w>;wV%i>eO3oD3+=2=ChQSpsfYdd=dF3FLfuDu&3YST)TSEo4Cedda2o$f#IP)WWgksPWPhP`IPWgW`K#IRQ~QW`{[h Q`WWkQkIW'~Ik  XIQ'[I~P)PgjW)QW)#jKX)g#Q[RQ`{{KR5o=OO%O%%%OOOOOooooooo........................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooo%%8O@+K^XsK#h5 KKhEE5h ssX)`RgKh~gghsIRW{P..+o=oOOoOoo@.YLS@o+o+ I'{RhRKsRWSsPs oo=oo4DL@@fEE'hYsPs#YYPhLPgX# $X+o+=o==O&&O%O33=<4=fdo+oO+@O@oo@+o=@+@e4FSeefJfU2444e523FU=o=OoOO%OO%wu8w68uxyuwwtw-;wu33L/D>uwurZxtn8-yuuwwwyy&=4=5<<F+o==o2o<f=&Oww%=3O%w3>3=wwwwuuwwuy,wAAiyVyyuVDTDwViyuyuw>w8668ww8wwAVw6>nwyy>y6t8u->twwtwwwwwwww8wO6y>wtyV&yuVyu,AV>yiy>VytAuViVCD%ei3,Dd&FU^i3eTfE)SsLP)^F4L=4C^^Ud3===3Ce=ooo..o..ooooo.....ooo+.@.X5KI)  $ #Y4X.......  .......ooooooo................................................................................",
+"................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooo@o=+o2C5o5FLao+=dC>&O>t;u%u%>3C=eOd+=ed2|`h@EEY_^^^LLUfTDeeAo23ofEL3d4<eoe@aULShgIRKKRkKP~QRW{'WWPP`)~['kRhK}{{}}W`}~PWWQ''!kjIR[)IkQPXPRshjg#gsP|hI)'gR{[WI`[_`_DooO*>O%%%OOOOOoooooo.......................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOO%OOOOOOOOOOOooooooooooooooooooooooooooooooooooooo6%OOo.f)R KPggSh5Y[YSLIgKL5L`[Y5K`WII[{[P4o@3oOOoOOO&2@.2EL@@+=OX h{{)QKKhP'_E $o@@+=o2@d54L5hRKh#sg #4+S5hEI)gs.+.+oo=OooLUe=@CL4f4+hL@.o.o@@o@oeO=O3L3=o=d3=d]T3oCLd=4<LS2o==ooOOO;ynxxvr868wuwtw;>wuwwAUA>>;uttw;wDTTVyVu>>wd2do54EY4@o+=+@24u&ww>%O>y%%>yVwwu>>wuwwyFuVUUVyDyyyADUA;8>>wtyyyww88wwwwu8ytwtwx8uu>ywyywwuu>-wuwwwwwwww;>w>>txV,FV%Vy>yFFuw>w>yV8yDiwew<L4=<<dd4<eLS2EL4Lhfgf)_Taof3F^dFe33e3==de=ooo........oo....ooooo+..@5RW_g4.+@..ooooo...  .......ooooooo................................................................................",
+"................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooo=o2oo@+@do@CU2+deFe%3&wyUuU,>yDoeeeoe3=Oh[s5`CTJUdLC4d@dF+iYST^CULCSTTd4EEefLSgh#KPWjR{[kRKWPRhWWKIPQWWRgI`))`)`QsR)W`'RQW'W`)`{{P''PQkW'$$gW)#R}RsK)``}`g))S#@fS+o@O*%O%%%OOOOOooooooo.ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOO%%%OOOOOOOOOOOooooooooooooooooooooooooooooooooooooo%%%&@.h[`PKRIgfYCS_Esf5@hSSYJKRYKKP``}_ .22ooOO%OO&OOOo+@sRg.@oO.5.$LWWWhIKh)'`Rh2oooofEE4LKLIshP#WhK5LSS.sLSYW`ULW@+ooodFLLLL+FD.fSf5K)ffs5<oo2dOoCSULdeDe3ee3OSFd+odF3+FUSo@oooOOO%8wwvtt6;>wu8r8;>wuwuuVy>&&yVwVV>uDDu>uwe3O=+Doo][S@+42EY@C2uOw&%w%VV>>8ww6tywyDDFxyuuVAVuwuVywuVAnww6>wuytutuutttuwtwtwwytZuyt;w>>>yywwyyw>wwwwwwww>y>8VVw>dO%Fd&=3Owww=de3>SCe==e=2O@F25CLo33E^fff^YE^sE^^YU=oL3ee3&&3ew==w=@oooo......ooo...oooooo@.o #gg.Wf.<oopooooooo..........ooooooo................................................................................",
+"................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooo+o+oYY++342fCdCoo=>>FOLUTFDEDLdFwUedEFj[RKS45O%O3eCe+o24d4+LDeffUUS^TDDYLTJhEE)RRKW)WRKkgPsSSK)^KPWKRIk)jIIkIhgIRRW['kRW~R)Wg[{)}'RgIgkWWWK[')gW~'[{{[))RX..o+oo==ooOO%OOOOOOooooooooooooooooooooooooooooooooooooooooo...oooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOO%%%%%OOOOOOOOOOOooooooooooooooooooooooooooooooooooooo%%&=o.$[hK#PghsP)SS4WKsSP#shf2YY$E'Rh# $$.oO=OO%&O%O&%=EEg)E.2O>o+o@5o5^{{`KY)W[{R$++ooSLCffKgsKPhEPY)YSSLLshsQW^]``YLYSETCL=f4+2ph4S)Y#5fgLYUDD/EL^LoedeS=3a3C4CU^TFFHCL+5Ss+.@O%OOO-;-rtxtwwww686;>wwwywwwwwwyVuyywudyCed>3eO355YERWWS@oSER^E)Fwu-%>%yt8t8;--rw>yDDVwwwxxw>uywnt66wttxxytttuw8tttyyytttwnt8uwVwwywyyunwy8wAAw;wwwwwwuuwu;tVw>%dD3eFF>3DC=3FEU3SDiOFfED@C2+25S^fJfshpS__SY^S`Lg45S+=eDyu>&>3323=@ooooo....ooooo..ooooooooo@.#$WEPs.oo2oooooooo...........oooooo................................................................................",
+"................................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooo=oo<oEYode^^5fofD2oDwuTD=LT&UUCO3wTAdTd){[E.@4CTeeOoC^YLh#oD]L22fY4S4dSdffLEW)E^L^P)RgWKKKhIIgIhg#P_PQK))~Wjgk#)WW)WQQR`RI~Q~sR'gP[{`QR')Qkjg!PW[R'{{`)Ys.@2o=o=&Oooo@oOOOOOooooooooooooooooooooooooooooooooooooooooooo....ooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOO%%%%%OOOOOOOOOOOooooooooooooooooooooooooooooooooooooo-%Oo@@X)KWIIKS.KK5SY[{[Pg #5PSp.p[h#X.@o$.+=O&6%=o%%;&=E`WKPpoOOO**o+oogE_`hWgR`){[^.oeEL+@hIPR))[$s$$<ooe+Sfh$#..S_REYffYgfp45L4<fYsLPhYS@@ed33CoFooe@deaLSfaeL,,DETTEEFYSog])sO%OO%>68txxytuw&68868wtuutwwuyVuCAe3dd=oO3Ce=32d@KS^sS2.hE^PY`)WVu&&&%-;>>w--w66y88yu>8nZuwyyuuVuwtnnttytttttttttyxxyyttw6twwxwtuwywuy>y%uuwuw>uwwwwwwuuwwww;-wuSLe3eC33]_LdCUS3333iSe^)Uf@4s@Ss5.#@f@L^f@@Y)L<@CoCS+Ou&w>&===23OOooooo.ooooooOO.ooooOOOo+o.@ $[EW[@@@@+ooooo..............ooooo................................................................................",
+"................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooo..ooooooOOoooo+<=+oL^.@LSYf=dOu/e3Ce>=o&dduOywVUKQ[#2SLEUTE3UYdLs5ILE[L+EYLFTf3SCYJSLKSLLfSLIsSWQgRIKgghYIgSPggKjk~R~)RRIWIW[WhW~KI[)RQRPI`R}{~~~Qsh~{'``[[{[`  .@+ooOOOOooo++o.OOOooooooooooooooooooooooooooooooooooooooooooooo.....oooooooooooooooooooooooooooooooooooooooooooOOOOOOO%OO%%%%%%OOOOOOOOOOOooooooooooooooooooooooooooooooooooooo%OOo@#hWI#Wg5KfEShgR){`kssssPS$I)C.@.+@.oo2COO-%OO*O%%o$IW|I =u-OOO%1Ooo..ShQP#WhPK{_2o=@foXIPQ#KsLh@.<<+o5L5JsII#]Ysf$X5#S$SEL$adeS2SKLff4dFduyd3D3eSSdeU2=af^Syuw>wDLfdKKSK^YsO%%%%;6868866uw>88wwwtttwnuwyVAwCd3ed=eEEETD324+E^5LE_WS)^4^)25s&&O&=%&%O%>--86tyyyyu8uVuwwuyyuwtttxxtttrrrttvxxtyxyttttx68wZDx8yuyuuZ>Vyyw>w6wywwwwuuuuuwy>wVwwSo3C=223CF2=3e+2i]^d5d2gL+^_^Ip55PssILL...4Ef.S5+^Fo3yuu>>ww3=@@oooooooooooOOOOOooooOOOOO<o@.#PKJhPf.@ooooo.....................................................................................................",
+"................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooo..oooooooooOo2.+<@@+))J$5S44de>>22e3e=>w%OuwwwyyXKKXp4f=AVU2Cfo2gS)W`{)ffCpf2FSfCSShLLahSLYSIL5QKWWgPYKssPh^WKWIWR~QRIPR!P[{)R~W{}W}{)W'g)`s)WjWjgQ'Q''!`{{WW) j=+oo&%Ow&>%ooo.@oooooooooooooooooooooooooooooooooooooooooooooooo.....oooooooooooooooooooooooooooooooooooooooooooOOOOOO%&OO%%%%%%OOOOOOOOOOOoooooooooooooooooooooooooooooooooooooO%&o.XIWhsRhgY5RW~RP`QkQ#Ih #$K{Lo2@4.@S)UC)E%%woO%%-w=.W##K#2O%-:6OOO3=5@XXKKW!  ._^o@fY5sggh PsXss@@@S@3Tfs#5gS5sspERS#sfp_[)Q2FLSLS@f5edddwyDE3DFU^C4f3U5dUd4VuuAAdfFLPE^h$X OOOOO%-;-68;;wuw668wutttwVuuuuVwe==e==E{DLT)^^^fSKShLfs.S4@@2@@#2==@oOoOu&>,>>>n>wyytwwwwxVwuVn8xvr88rtttttttttvtyytuwutxwttZDntywyyVUFTDy>wyyyuwwuuuuwwtwu>DD;US4d+dF=eSC@fUDo+D[^2S)f@.g{[RRKI_)g_'K +@f52oh4US^f23OOw>wuw>@ooooooooooooOOOO%%oooOOOOOOoo2.K' I` s.2oo........................................................................................oooooooooooooooo",
+"................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooo..oooooooo=ooo<4DSo5L^R@5f_]SL^&3323==duCUwwuwuTKsQI)Y2=3O3=LY^)R)'g){)2f55df4LCL5hSSJhSLRKs54Y#jRWRK#gK^YsRPgIgQ~PR)PI`QP``KPW)[WIQRIPKWR#R)IP'!j`'W')))~'~`sX ooowOO>OOOoo@o.@ooooooooooooooooooooooooooooooooOOOOoooooooooooo.....oooooooooooooooooooooooooooooooooooooooooooOOOOOO&;O%%%%%%%OOOOOOOOOOOooooooooooooooooooooooooooooooooooooo%Ooo@h''RKKK$RSajX$gh!~`)PWKKW{)o<ooooL[{`O**O-%@OO%%O=@W'gs.@,%%%%%wO&ooo.$$R[Ps X@.@o+^EfP Q)RQg #.o@+@o2S_##R5X$SKKJIsg$Igh5Py3ESLSefSfeyAy8tDdCf=d242fD4aFLdAVnACedLTfS^s $XOOOOO%-6rZAy8ww>>>68rrrtwVuyu>iu3dDCo=SDd3of4S)Ef+..5+.5..42$@s+2o3oo=+CTu*uAV>uwutuuyyuxwwyu>8VrtttxnxwttvvvxxxttttwwwtwtZtuxutV88;-V>DDwwZywuuwuuytuwwwwu>Dy-[_o<224=eJL5fLC4ELfpf4g4$.`YSI#XP)WPhX .X@.YTfhdo@o@o2u&>&>>&OoO+ooooooooooOOOO%%oooOOO%%%&o..$EWI'$Ih.+.......  ................................................................................oooooooooooooooo",
+"............................................oooo................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@+sWPsKQ)R$g[`SLiF$+@3OrxlD^8>e42LLDEL/=Lw3%^_f4pESSL2@ES+SYSfLSJdLUfDSPSgsKfh^)KWIQ{{)PIRRWWIghjhPRKWWPR~KWI)RI){[ghIPKQWWs#`Wg^gX'RW}{{hkQ!}g$..OOOOOOOOooooooooooooooooooooooooOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOO%&&%%OOO%%&So==ooo=OOOOOoooooooooooooooooooooooooooooooooooo@o.o)|R#ghQjgIWDSgsK`)~WQ'Q!!}~+..SS.4of4oOOO%O%-%OO=oL)`^S@o+o;%%%>&%Oo@.@ IWg)fo=OO&&%ef)pXKjPIh#+o@oo24RYsKsedS4ef++fS2fp4L4LYSULFLddeDedCiwshLdee=dFDdf5h^LDLffd<ddSLT+4.5.O&%O%-;%r;AG;VAyD%w;&y-6>y>ui,yy4CYL_SC_D^Ef2PLfCO32@3522<==,ww6>;--->,wd>eOFe3OuyyyuutyytrrttxxttttttttutyyyyuwyyyuuyyyVuunnutVytw>>w>%%6ynFGA>uA%xntrtw,ee4SW^DwuAuwd33^)TL22EHFSd+5s@gLhEE[)RCfC2.$.X$R_f2=oOo<o@@Yi=o+f2.o@o&OO%OoOooooooo...@oOO%-%-%>oXggWP)LE5oooooo.... ..........................................oooooo................oooooo..........................",
+"............................................oooo................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@@ h)gXI'[RsPPCdACf2dSu6-779-&e@f@U^=OC&TDD3SdYLpS+SL@S[_@2s+2DCSfCS5fhEPSYg^RRh@)W)[[R))gI))P~`}[}WIIQIW)kWkIWRW)WRkR'g)Ij#KsRK5g)Ws}{{RQR)|K ...OOOOOOOOooooooooooooooooooooooooOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOO%&%OOO%&>3e3DC+=oooooooooOooooooooooooooooooooooooooooooooo@5+4[{sskKW')RRYKKg`'`R#!IhsQ~'^@@E^+o=OOoO%O&>-%%%OOoef4+ooooo%%>&OO&@<.s$ I'WS@o=OO&&=oLL5s#kP###.h+@3o.hEKgK42dLSoYEffD+2TffSSW^T^SSddFF&=DTSSSY@FY3Di4U424LLLH=dDC<fiEp@$@oOO%%%%-%%nx>AwOAFw>w&wA>yuwOwuw,3i=+UTAYUS_)SES+OVdFFde543=3uytw;;;;;>>>u>=33>weuuyyytttttrrttvvttttttttutuuuuuuyyyuwutuVVyyytyyuyuwwww>>6>-wADFy&VtnA;Auu>3CfR5t;uVuudeOUEhS4h^Ld4@452I)S^KR``@o4+@@.$ P)W+oo=oo=o3iTd=22+.o+..&OOOOOOooooooooo.ooOO-%%%8o+.RRjhRLf.++oooo.... ..........................................oooooo................oooooo..........................",
+"oooooooooooooooo............................oooo................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.$``I)[`RX 2e+Ve4=C>O8tv8t>ye+SYCSeeCF&DTe=+LT.Sf5S@QW)f2s5fD3CSTLFL5sSWRKWsSS^ShPKKhPRPPWPsP)[{)!)R~IWW)IKR`)sK#R!s``W'Qs)hg#X))hW'~RWI)[)$.+5@OOOOOOOOooooooooooooooooooooooooOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOO%%%OOOO&>wo=DeooO+oooooooOoooooooooooooooooooooooooooooooo@oo..E'IIIPRk~RhPPgj!#IIWXgQI'[)Dooo@@ooOO%OOOO%6%%%OOoooo=oo4oo&OO,Oo=...ssh`)hoo@=OO&O=o2.R|KgPJK)f.+oo2PL``PKPL@DL2LLLfCSfSfSYfWYYY=CdHH</EeUgK4S2fSCD<dUd4=^J^T<<Ld/STUS+.@.OOOOOO%%w%t,,%,ueeuFA%%yw&Vwyw=Ad3e3oCF<i=fpfK.2d^E_Eea333>wutr6;>>6>>>>O>>De3eeyyyyytttttttttvtttttttttttuuuuyyVZZxyyyyxVxuwyyuuyyuwwww6>>-;wnVwA^u,Dw8uF,d+LY+%>uwwedeDF2fL+S@YH+@g4SSIWI4EgS@+o@@.$@@$4.o+o=Oooo@3F+o+5fshR#.%%OOOOoooooooooo@oooOOOO,o@.XhRW)[h.4oooooo...............................................oooooo................oooooo..........................",
+"oooooooooooooooo...........................ooooo................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@Xs{{)WW#)h@4C+e3eUy>yu%>u&=o2CS2o&ey>wddU+S5Sho.ohogL^L^EDLTFSFTD34fYYKs)|WfhgLKjsQgsgg)sgW~!RIWkWRIR''WK![{Q~[`IPgIRh')WPgK#K[)~gRjgR W)pooooOOOOOOOOOooooooooooooooooooooooooOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOO%%OOO%%OOO%%&+oO=O+oO=+OOOooOoooooooooooooooooooooooooooooooo=@@2+.SIXKR#IPPksIIhI`~R# K)'['.@o<OoO@O=%OO&>O>-%&O&&@o=@<@oOo&Ow3Y^__KsPW`[PY +oO%O&&OOCToK^PQII){)$@++2gsRWKWLSS4SSS2fLdY^2dSg2LfS24fDTidDFi4LETfLD=LC3C3deeY+h^`ELTSE^35@.5.@ooOOO%,w>Vyiu,=O&>%U_UeCdw=wC3>o+43e3weUL5ff+4+EEoCC4dd=3wwtrr8wwwwwwwwO>wTAwy3yyyuwutytttttttrtttrrtttttttyyyyVAAVyynVtyyyyyytyyyuw8>>>>>8>;->=eLFD>nuuw=eo)Tf6Vx>wyeiC<5osSKSHf^S^[^KhSfP^E@52SC.25.#@.@.4oooOO=&==+f2^PSL)gXO&OOOOoOOOoooooo@o=o=oO@oT5S)sW)[P2..5ooooo...............................................oooooo................oooooo..........oooooooooooooooo",
+"oooooooooooooooo..........................oooooo................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.@ `{`'[YP552LiOVwDAy>>=w=D32D)DTCF>3yV=LdC4.L4#sKPf.Ss.4LS4ddLDEUY^QSgYSK_`Eh$hWhKPKsssPY)Rss~PPQ`WWP`))Ik`~hW`'PhPWK)RPWsKPK)hgXI`k!j$WLo3=O%;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOO%%%OOOOOOOOOOOOo=Oo@U`3=OOOooOoooooooooooooooooooooooooooooooooooo.@LKKRg#ghXKPQ'W)'IKRKK)'{LoOoo3=oOooOOOOOOOO&OOOoo+o@oooO=O&o<]{'WWWR)~sX 5+oooO%%O%@@E)h$X))I`^.f2o@@.h)RKRf'K4f)Yoff2_T4dfKPf5op@pdpYSECU5SYSLUfCiwe=SCCD^o^YUTDT44DL....ooooOoO,%yC3o<=eeeF3O^EF>3=UV>F_)S=4<eV,CEiDDoLET=e^ST^o3uyxvtvvvttttttyww>GA>VwuyyyuutttttttttrttrrrrttuttyyyyyuxVyutyyyuyZZyuyytwwuww>>;;>8>>63==ST,CeC<HSfTDCyDV6ydeeeShSsXK[[.^W2WWh^RsIhSR#F)L5.@^YsS+4o@o=OO3&=@5L[{IYX5`gOO%%OOOOOOOOOOOOoo=oo+@@2#S{)g''Ws.@.oo+ooo...............................................oooooo................oooooo..........oooooooooooooooo",
+"oooooooooooooooo.........................ooooooo................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..@R{}XW{s5L4SYC;%,w3wCed=42eSL33d;uywV3CLSLfE5pKJELSLDS2o@SLoF)LUDSSSgShSY'KsgPRKQIPSY)SgKhhhK#I~gIX!QW~jgP!WIRP#kIIRIjRWKI|P`WkIK{WR)5So@OO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOO%%%OOOOO%%%%OOOoooO+@=2=OOOoooooooooooooooooooooooooooooooooooo++o2.2gJsJW`W`{~W'~WPkPPg`_fLo<O3oooO=ooO+<oo=oo=o=ooooo+oSL3OO@+ohKR'['Q{P 4@.oooOOOO;Oo3o$YSKIss.$ssES2+S5ssKs gK2+s@.@Y2SfSSPg2$.pfgLEp2LLL3hS5YDFCCUS=CHCdD)+U^+dTF4H2h`_hs@@@@@ooO<3O3SEfooULULeoeYJd^Ted^_)3=3iOewe3Sf2^`eLLUSDCe3unnxvxcnxxttxxxAuwAAwZwwyVAZVytttrttttrttrrrrttwwuutuuuwtyuutyyVyyAAyunywwuyytuw66uyuw6=d4dSieeCeSLSe3dyAxuVVed4S5`EpWWLX#K5XshKKWWSPIP[E@o@L)SY_S_S+oO%OOoOo@g{{WKKgK)wOO&OOOOOOOOOOOOo+oo.S#X s') I~`P).o5.ooooo...............................................oooooo................oooooo..........oooooooooooooooo",
+"oooooooooooooooo........................oooooooo................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@...K{RhEWWY2.+D-tuFASD+<2oL^^DDDwUD,d%dCEYJf)fL5$KpS4LS2d=+FCDd^TfsS5#SKYsPR g^PI'`RR`)PYEISKS5I)P'`)PPPRQWIRWQR)sQRhk)~P))WsQgsWKKQR{)$o3OO>%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOO%OOO%%%OOo=OOOOoo=OooOOooooooooooooooooooooooooooooooooooo@oo2oa_``RRRIW'RRRRQ`RjKP)2o3ooooo2ooo222o5o.f.f55YfCf2C54^_DoSo3=.XXhR~`['..3OoOO%%OO%O=+o@PEE#$5..5@SCo.5K)PsRK ssKSWY542+4U2@$I^))^EgSESULTOhS4TETE_EUyVd&=eSLE)df2fC4o2EE^K5$o..o@ooT^T(T=fD2=DeYT+oed232=o@d3C3eww&eeed<SLeD33dVwuwwttvvvvxxxxxxxxnuynAtywwyVVVVxyytrrrttrtrrrrrutuuwwwwuuuyytyyyyyyyVVxynywwyyyyxuyyxnyw;2C<4pf=Sfed4dS43ttwuyydSY2.#s'`K@hSXs^gSPPKRIhhYEShsLLsTfKCT)o3o&%%Oo@+SY`PR)KKKDOO>OO&OOOOOOOOOO+@oh_RhPW)W KWI)S$..+@.oooo.............................................ooooooo................ooooooo.........oooooooooooooooo",
+"oooooooooooooooo.......................ooooooooo................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.+.@+[`$sgW[K@ohZnODDSLh@STL43eFw>FUVF^d=eC`[K22h#.LSafFo3eCLdDYdLLSLhsIKgP_ghYIXPWRgP)h5.IY#sPEP~QI~#k`!~)IgKPI~RKgQ~)QgQP RRPPkPI~IR[[22o&%O%-OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOO%%OOOOOOOOoOooOoo==OoOOOoooooooooooooooooooooooooooooooooo@o=oo=+o.2.  Y[WhI`}W)PR`W#@$.oo+.+@+LD^[]^)RIWsPgK`Y^WSLYLS_[^Y&CC.$X  X)'So+O&O&OO%&OO%Oo@+.@pI$ @@D+s4@5@sYg5hSY5s5L_LTLf22pS2R_KS#)E$g2DUSdD@gPf4CfLAFH3d3CeLSESLd5SdLT.Lp.fWEYLLE^)EE^YDff4deDL+2ofY22oUUFe3d3OwO,&u&LUOi_FVe3FF>yyuwwrxcvrttxxxxvtrrrwtt6xwwwwwwutytrrrrtttrrrrrutytuwwwuyuyytyxytwuyuyVVxtuuyyutnyyyuwyyuL_S24^D2LE[efCeexw>ww3CYLf5XP)g#sssI)}KgKYKh`WP{_E_(sfDffL@=4=+oOO%&o@5YPY)js)IgT%O>OO>OOOOOOOOOOo5.){[W~`R~#'Ps_o..+..@oooooo..oooooooooooooooooooooooooooooooo...ooooooooooooo................ooooooooooooo...oooooooooooooooo",
+"oooooooooooooooo......................oooooooooo................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.o.o5hIE.hK_[K@2Zw&=2SYQ_ES@3=>3&%uFCDY4E=5LfSSo@$.YY2D<2=Sf3CCLSU4h^EPIR)KIKhW_WRK))PWKELS^ggIWWW)WRIkR~{'IPWsgRKKRW{WKhIWP)'WkRIg~Q!gWfoo=*OOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooo$$ s[PR)Ws#$ $X .@@...@#s^E)W`)SRIPYIRKW`PPPKgKKPshK)X;&Oo.XXX .ooOO%%OOOOOOOOOOOooooo@@@+@.o+Y@o@@..YR$5KgPY$.ofL4=DDRK@.X$WWS_YLT5d4#45U)STTHe`^STCSsf+^fCUfdSSEfgW4 SsgYE^D<ofFYdL@OCCeL5CLE[LoU^LF<33=&&&&,wuuueeduuyVVuw>y8wxvrrwtwwt;Ztv68rrrrrtwwuuuuttttrww8wwr8666wtyZxyyywwuyyyxyyyywwtwuUU8uutttyyyyxywtZAZ2YLd)fYU^Sf4eeC3>FD>=OaSS$5#W[KP$`Yh`)hggIWR)hgRShSLSE]fooooOOOO-O%&oo@5gK`#|K#gC=O=OO=OOO%=%O>O+o@)'QPh''P['[))f.+@.@.ooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................oooooooooooooooooooooooooooooooo",
+"oooooooooooooooo.....................ooooooooooo................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.o@@sK5Y)g^W@oeS23+LpU{)<=d>==AAyU343FLS4@45ff2K`@443@3e=OYT)C4pffSsKShKsPWW'{~kI)EXsShLSPh)^R)W)'R)RP`{~!)~PP{[`~kgK|R~Q`{'Q[`W'RKWQ#)DooO=%OOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooOOO3oo.$$ K_5@+.+.@..X  $hIRI^WhSsKKsIhhQP)RPRPPIRgKPgshIj$%%&+@o..oooO%%%-OOOOOOOOOOOOoooo@o...+<+@o2+@+.sf..2#ps.+oo@2YF=$@@#.XKIL(EfdCETS5oLEOHSCCDECLdD$KLh4CCFfDJf(_))^s5$.2o<=4Yf3ofp=eCLDofY+LCd4+3>o4SFw&>u8wuuuueiyydVVytywxuu6;xVZxtZtZxxnxtw8rtxuuuuww88www8889w8wrttrwwtwwwwwwuyyyyyyyyyyVy>yVwuutttyyyyyywuVAV3C==2S)_So3CdFL<yu/eo4d5.sfK))#X Rgh_WsRIEKIhgWW55fYS_`<ooOOOOOO-O&%oo.#'`IhW[KWTOOoOOoOOoooo2oo@@s{PkQj}~jR{{[)Yooo.@.o.ooooooooooooooooooooooooooooooooooooooooooooooooooooooo................oooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooo....oooooooooooo................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.@h^h4Y^PsSF^S5o42YL52@oSu%w&=V3SCd+^]ULd4e$U_LUdowO=daofY)EDf2hSWRKW[WEKhS)PKPsSs 5LILRS)g~W~'PKIk~IRQ!gI'`QW!P'kP`Q)~RIP'}~W'`ks#52@oooo=OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooOOOOoooa+ hI^Yo@o@o.2.#X W[)^)K$IY$gQhKgKPhPRQ!hPgPPRg5KWg{R&%&33+oooOO%%%--OOOOOOOOOOOOOOOo+o2DD2oo=@oo+=o@....oo.oo@@2@ooo@..@.KRsY@54fUEELCUf4,i,e3HT=efpEShf4fdD2C+fSShg'{{_f2S^Uo3ee+@ew=o@o@2.o5T4oFd>3iCdu,,888wwwwweyyyyuwuyuAuww>e3uw>xw>88tyxxxtrwwutttttyttrrrrttrtvxxtw8w8wwuuuyyytuutyyytyy6;wyuuuuuttttyywuyVxei=d@DD=3LFdd3=L1ASd3d^E5g))W)gs'RX#PKI`WKIP)KWgsRSLSfo3OOOOOOOO%%&Ooo.#Y)shK'R)Uo&Oo+2<of^LhSCLLsSPKRIWWI'k{{{`Y+ooo@.o..ooooooooooooooooooooooooooooooooooooooooooooooooooo......................ooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooo...ooooooooooooo................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@@o@f[L._[[ISgJ@SLfSSdSD)Uo3SDCL3C2e4S2EY^Ee3)_C43u3wDL4oSL`RYYYL))WIK){))RYgKhW['R)'KsYWsIIR}KPKWQsIKk)'!~~~XjgWWWKW'[{k#KIQ~~~~PPX$SSe==OooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooOOOO*Ooo@oKs5f+oSD@)+2+sRRII)g$^WhgSKhgYK55WIRgsRIR)hPPPgKIR&%&ww%O%%%%%%%%%%%%%OOOOOOOOOOOOoo2LUDL^EU<o+o+oo+@@@oo+@o@@oo)LF2+@.L)K^ph43DUyeE[EiCydiCFSHi4dfYJS+LYSY5L)p##W5R)^TU+LF,,=>ye3%33dU)E$^D@L/O%>Ce==3u8;wwwwwuuyyuwww68wwywO=435ww>y>&uw>wtxxt8>wwutyyxnttttttvxxxttttttttutyyyyuuuwuuuttw>wywwywwwwuuuuuyywwtyy>Cy=<ddL4C544diLefS25LJsSSYJKI SRWR_WgsfRhIW_h$SJggLS2oOOOOOOOOO%%%O+o.g^PKgK)[`iOo<@oo.aEWWSPsI)LE``{)###}[[[_Ye@+o.@....ooooooooooooooooooooooooooooooooooooooooooooooooooo......................ooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooo................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@ooooo@E].s5fKE'RP)Sf23=^)De343CT/oLUTC52F2=DDi[_U3CFV&VS35EY)j4SSffPKI)K)IK)$PPgQRYXh#R}'PIWQ[[Rsk)!RIR'jh)['skWhsk'``I{'RRW'}hRIKW`5+5=ooO=OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooOOOOOO=@+@PIsC.dDCL^Y^^)'RhS)fS)hfY+PPfYYffLWSf545pSYSKhsh'g=OO=&OO%%%%%%%%%%%%%OOOOOOOOOOOOO==oo=dFDUd@oo3oOoO&oo@oo4o5Eh)[)fo@@pYp`Lh3eAFuwFwyFO>,ee+^YoLK+g2LUS2LLE)LpSR^5$4s4Di&,iuu,uVuu,%OSLLJhC+C^Dy%=33uuwwuttttyyiiyw>8utwwOOe=2fo+eeyu>>yw>>>6wwurwwwwwwwwwwrrrrttxvrrrtyxtttuuuuw8wwwwwwwuu66tu6>wwwwwwwwuyyuwwuunZy>DCo<2DDDf4OC2.fS+SYKYfpRKfLQ'~RRKYPfELPS^'Kh_PKS.@+@OOOOOOOO%%%%<@$P'P)]))_Lo4o+o.+ESf# PWP`}){'`{`WW')} YP$oo+ooo....oooooooooooooooooooooooooooooooooooooooooooooooooo........................ooooooooooooOOOOOOOOOOOOOOOO",
+"oooooooooooooooooooooooooooooooooooooooooooooooo................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo+ooo@o.f)^Lhgg_~g[J$+duu&_VODeC)^UooSE4SY=de%uV^eCuy,yA3yDPPKg#saJLSWPK)WgWIhhKg$ KsXK^W[IIgQ)IPgg~Qk)W}`WQKR's#kW)}}'Q#IkgWW`)KhR_)YS@O>3>%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooo.oooOOOO&OO+..gSg54+2a52LLEYfSL2Ef+s4S4FfTFd3C^(WSCCSFD)DSYLIY)S+@oOOO%--%%%OOOo%%%%%OOOOOOOOOOOOOOOO==Oo&oO&O&O&OO&OO=o+@@4D^Y$=oo<.pIL^f+dUVAAwuwE_DyU=i4U^5fSLKS5JYLULES4hsgs_L.4fOdiytOtn>u8tyd>e22f5+EDCFO8+=we3;>ur98wuuuuw>;8tytyU=2=5f$$CeV3>,>>&&;>wtuw>>wwwwwtuwrrrrttrrrttttytyyuwww>>>wwwww8>wuw>8w>888wwwwwwuyuwwwwrrtV&%Od@f@4EY&,LLpJSY)RLRYEYLY_WIW)KYSYLLfKRWEgPsY_o@2oOOOOOOOO-%%&=@2PEhSP@5ooi@=+.s+sWR|)`'g'`{[I[^__`R+Y@+..=oo@@..o..oooooooooooooooooooooooooooooooooooooooooooooooooo........................ooooooooooooOOOOOOOOOOOOOOOO",
+"oooooooooooooooooooooooooooooooooooooooooooooooo................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOooO@oo@.sP'{{[~)[|g_dwV%TT>2C4e==Y54TTe^2=>>xFd>dA>yyywE)QWh_Ih+sSKWIYIPIWRhJhgh#IhKK)sI)Kg#~KIQK`RhWsPRWPR~)))`~QPI)kQ))I`'RQPW[S.@o>>OO%OO%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooo.oooOOO%:%OoY)fRhSsgLaLUeFCCSd2df4S=@DddVDDVADD;LF3,y,V^^Ti2L5  @@oOO%----%%Oooo%%%%%OOOOOOOOOOO>OOO%OoO,OO&3OOO-O&&O%&oOoo+.4..o1@@2)K5LJLFFVZtV,uFTUyLU=e=TLS5YYEShY)^TYEfL)sfhfR<<dOu%nZ888u;wty>=LYTo<FS*&uye<&&&&;6886666>>w668wwtnA=F^^Pg$Y3CeCV>w&&>wuuw>&>wwutyxturrrrttrrtttttttyyuuuuw>68wwwww>-ww;>uwwwwwwwwwwuytwwwwFxrD,e<o3o3de3=oPEKfW{_SsSPh.44SRKKWLSsSRYYsf[KKSShYLeoOOOOOOOOO%O%Oo@@sK#.o.5=D)@o+S)^P['~R[`W!}'ggKI$.@.2.2..$=Ooo@..o..oooooooooooooooooooooooooooooooooooooooooooooooooo........................ooooooooooooOOOOOOOOOOOOOOOO",
+"oooooooooooooooooooooooooooooooooooooooooooooooo................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@oo+@o$@ gW{{{{``)dV8DFAyddSS_e+++pL2d@&wu;UD&y>-n%yy=dhER)Rhaf+hKS`RhgPY)hsWWWsKPIhhKgRhkWhPgKWRPKIQkk`WP'{{}~Iskkk~[R)R~k''(E.<3&%;%%6%O%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooo.oooOO%%O%dE`YPSW)|5#+C+=Cd1idedL3dCCeDU/FDyytnnTDuViATTAH<L_4KW.oooO%%%--%OOo..%%%%%OOOOOOOOOOOO%&%OOOOO&=OO%%&%-;%OOOOo2oo+..+oOo+S{YS)Fa3Vyrr,Aiw>8ywTUo@4hP)SP4YY42@JLE4(EhRYL_Y4&u%n-nZDn-t6>VD=YLfh4+3>y-;3==>>;>wt98666>&tttr86tV>3D_(P''EOdyDF%ww>&->8ww>>wwwwwuww8888wrtttrrttt8uuwwuuwww868wwuV->u>>u>wwwwwwwwwuyyw8wu9xvnt,3O++32f3,=X@.s$$posg.sSs52R`RWKgYgPYsR`X5PKggSPDDOOOOOOOOO-O;Oo+.. ..5oooC4o2^{WP)X))RKh'k)hhP.Xo@@<@2+.+.o=@ooo@...oooooOoooooooooooooooooooooooooooooooooooOoooooooo........................ooooooooooooOOOOOOOOOOOOOOOO",
+"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@o@+oo4L'``YS)S2F/TA>yZ/{{[hYg222oee@3=33>dTu>TD33@S^({KSL+fhSfSsPKPPWKgI$sW'QgI~jKPR))PW#K)'YgK[{)'RP'{{W!!IR}[kWRRPK^`>&%O%&%%%%%%%%%%OOOOOOOOOOOOOOOOOoo=OoO=OOOoooOoooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOO%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooOooo+@oo@oo@@oooooOOOOOwOO=oo25Y[Q###XLEe=oe33yV&VuyUUtxVVyyVAGCFy3CVdRLf]LFFyF`edJSE)X X X..+o=oOOo=O--%OOOoo@.o.+.+@+=o@@oOoOO%OOO&%--%%O%%%O>O&%%%%Oo@ RKW{^38AvxrrtxtwrcxwVUE^KP`hVy>ETVADF^CELfTEXI#RPJ@3>uy>Gni,&DUy;yVyD>uyyt;w6>->w>;uu>&&>>wea14ee1O11@SL+sQ)K5s$@4eAu8688;6t>=&>3www>>wuutttwutyyyyyuuuuwwwwwwuw6>>6w8>>>8www8>>>8wwwwuuwwwutww,333>o33OeV&>=e=3&OunwVOAeCoDSI^KWKWYs5KKYQgSI5_Lg^S.oOo&%O>%O&oO=o5)^soooO>O s'{WPI IRs)^S@@fYYf@++ooooo++ooooooo.......ooooooooooooooooooooooooooooooooooooOOOOOooooo......................oooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@+@o=d J[K 5LTeeo,VuZTL['L_Sg2Ff=2+=Ude3Y_+=^YofJJLYgSSLaSW2LSgJP)`WWRh~I!)hPKghIgRRWhRKIKWIW^)_WPjKRQ)gI)k)'''PR`)gK.>%OO%%%O%%%%%%%%OOOOOOOOOOOOOOOOOOoooOoooooOOOooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOO%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooOOoo++ooo444+ooo@oooOOOOO&O>OO2@TYL)h$$#sCd3=Sedee>DuyAyTZAAVyyyVuieyCed>YEL^deCydCd2F^4SLK$ @+2.@o@3OooO%%%OOOoooo2oo.o.oo3oo=o=&OO&%O%%%%-;OOOOO&;O%O%O=+.sRhsK+eA>vtrr6xAZxtttueCRE`[gyiVFuyDDUHeCFLY^sP5 Sp3eA,,%>,,i>uyuw>>yi-wuww;8>w>->>>w;&>,,>>333di33uSLfC2JYhIYRf+f=VDwyt>6ynuw3>>33wuuuuuutyyyyyyyyyyuuuuuuww>wwww88w>>>>>>66w86wwuuuwwwwwwww86>,wuewOoe3OyDDULFduuy&y&AwCULD)hfP)sgYYKsK@IKKKPSShYS5+=oOOO%-%=ooooC)Ef=2OO%OP)'`sK{KK)KS24$.o<5ooooooooO+=+Oooooo.......ooooooooooooooooooooooooooooooooooooOOOOOooooo......................oooooooooooooooooooooooooooooooo",
+"ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@@oo@# [{f@E{F^_D&wwAX5[LfS+E^DoU/=CCoS_2+eDTeT)(EPQXCffYS$PhKP`{{{WgKPRKKsWIRPP#PKshgKK#ghKg$IKIP`R!I'}QWIj!PKs){L.+&%OO%%%O%%%%%%%%OOOOOOOOOOOOOOOOo+ooOOo==OoOOooOoooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOO%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooOOOOooooC^Dd=@@@oooOOOOOOOO%OOo@=Lh.hPWPsgD2d3F=eeuAFy%FFDAAAVyyyydyUVFFeFSYFe4ydyA3d32U4ahL)Y([EFSoooo==o%%%%OOoo2oo5oL^LL<oO=ooOoOOOO&OO;O%&OO&OOooo=O3O.@ _{P#KJo=yn6UFwynxrwtx&C2@$IQKGyVVidee<i@<@=DEKK``+4DF,O&i,uy>u>&wy>;yUFAu---;>uw-;>>;>>ww3=>3eeCu=3yDEEdE5#gQs)E ^)oo,yy>;wywuuuwwwwuyyuwwutxyyyyytuuuuuuuuww>wwww866>>>666>>wwwwutuuwwwwwwwwwwwwww333==3Vd>VCeiwwFFyiwTTOSFTYSsgRSghgQfS))KhsKfggsL2.oOO>&O%O%*O@oo=2ooOoO=O#'K[R$PK5Pg$.@@.ooo@@o@+oooO==+Oooooo.......ooooooooooooooooooooooooooooooooooooOOOOOooooo......oooooooooooooooooooooooooooooooooooooooooooooooo",
+"ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@@@.XE[P44_]]^DCuGV5gfP)LoL2fdCDd3Y)Rffo5Y__S)YsXhgU)T^[JELsR'[{)IR^W[WW[RRRW'KKEK[PPWWW)PgRP[))W'hk`)PPR~)s))KK@2o%%OO%%%O%%%%%%%%OOOOOOOOOOOOOOOOoOoo=oOLe=oOOoo+oooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooOOOO*OOOo5EF3oo@@ooOOOOOOOOO3o@=SJLSS#+K)PSCeFyo=>wuuuywyUwVnxyyyyydi^UDCdDede=ydyV3yyA3ad<<ofLEELY)^^DoO=&%%%%OOooodL^dLTeTE3&ooeOoOO*%=O%&OO%OO=oo=+3ooOO4 j`|P)!#533A,DDwwwttttyZweDSW)sFU/CyC,4f^S3ff@SE){)R^f<eHi=,&e&ue>&>wwu>>ww6ww>6yu>>>;>Vyuw,>>wdyy=&uwe4Sf)LLpIKsP_)sfTedVVu,wiwtyuwwwuyuuwwwutuuuuuuuuuuuuuuwwwwww8>>>688www88wwwwwww6ww8wwww8wwww>>===O=FEL;ie&i,OyywwwD^fTfSLLSgLfffKfSL)SffKgg^)RLSfoooO&&8OOOOoOOoooO@oO&O#hg)g ^..@@@+@.@+oo@+oooOOOOOOOoOoooo.......ooooooooooooooooooooooooooooooooooooOOoooooooo......oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@@+.2SS.5<^d2oue3F+f.^{D4)aFSeeT3e]Lf4SaaLS5IKWWK)SSC5YfsE)KKgsRRhW)EWKQPsISPsK)W[PIkPhKPKghWK!jWk)RIR~~'I){_@@OO>%%OO%%OO%%%%%%%%OOOOOOOOOOOOOOOOOOoO=o&Ly=oOOoo&ooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooOOOOO&Oo=ooo+OOOooo=OOOOOOOO=o=o@UFL5UhSS^s.o%CDOCuuy%A>UwVwyttyyxyywVDGAw_^33CVuuuVywiueDdCLSDSLU2O=C^T=OOO%%%OOOooD]LCe>3yyAy^EO&O*Oo3=oo>%O>3O@+oo@o@o=oo. W{hR`KX5o+e3y3wwyxxvrw6Ay2<pEQHwDD333dd`]L5S.E{E)PSYp<<^/oe3=d=eu&&>>>>>>>->w-wuuuyw,yAdwwww3ww3w&>yw>UFDSsKWK#hWW sEL4eiieu33>wttwwwwwwwwuuuuyyyyyyyyuutttuuutuw6>>>>ww8>>6www8>>8ww8ww68www666>>>===OOCDFFAVFeFi&&O&iu3<CY^YSp55YSYLSf54+S24I']W_YYREh5=oOOO>OOOOO==@==%O%%OX SYRWE@o.oo@=ooooooooooOOOOOOOOOooooo.....ooooooooooooooooooooooooooooooooooooooooooooooo......oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@ooooo.2@f)2o4oCCVd=CF5fffE2^4do<DOe43^{P.$f$S+sWK``s#SSSYSWWgSssWhPR)PYhKP#WWfsSPEsgKgWRWKsRK#RsKKRjI~WRPhQI))I@oO&%-%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOoOoo&&%3=OoOOOoOoooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooOOOOO%&OO%=O=ooOOOOO%OOOOOOOOooo+35edSUfUCdo4d>CDAVy3u^VwDywnyyyyxnyyVyuVyV_^eeAVwVVuAtVwuDVLTF/UVeOEUydeOoOOOOOOoOO@L`3=FVuuyuyVFDFCOy&%OwooO&=ooo@+@+4.<@oO@ '{W~`$gp3deFD=uyyw8rvtx;uC4C_EUeSU=UEofef4<^P5fShYfYfeed]UOSL3>wwww;%&>>>w>>VywuunVyyFVuwuyew>,wyw,u33e^L5h#KQkKWRhWg#244<4Cd+>wtrrtr68wutyyuuyytuuuuuyyyyyyytuw8>68w88>>;;>>6>>>>8wuuww88www8886>&&&==FLe&dywiweeyu>uOwi=C=LL+CYCC+SfffSLp_E4K'KSI''WKS4<==w%%O%&OOOOOOOOO%&%.+W`R]K.+ooooooOo@&OOOOOOOO%%%%%OOoooo.....oooooooooooooooooooooooooooooooooooooooooooooooo.....oooooooooooooooooooooooooooooooooooooooooooooooo",
+"ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@oooo@=oo=edCd3OoeF3Va.4fEd^^^e+e4eVoS_^5d5+5SLYYQhJp+Y_52ffg$PR'Wg)#R `g#Kg#)R5SPsPIK~QgjgR)gKR~)~Q!)I'KPRQKR @=O%7-O%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOoO&OooOOOOOOoooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooOOOOOOO%&&OoooOOoo%=*OOOOOO%%%o=ofJ=LCLYd3=OeCDyVFA>ywy_uV6nVyyynnnxyyVuAViVywiyuwyVAt>uFDywwu>y%>VFDyAeyFdO=3*%OOoO@@3LwdwuVyV>yywwyT&LV33LeOO=oodLgssPEf5ooa5)[Wk#g#.T^VFLC3yyu6yFFvZZw>w3dde>i(3<DoYE``LfS.PLSSDp4fdY)ffD<CCdw3e3&;&uyAwO6>wyyynyyAyuuydy3>uwyw>w==<sS5$gsR)IR}RhPYsSSspCC48ttwwvt8wwtyyyuuuuwwwwwwuutyyttuwwwwww6>>>;---;;;;>>wwww68ww868wttw>&&==dUD>VDuV3CeuVu,udu=e3o4Lh+4LLff+o4dfLS2U)R5JPKWR^`LoooOO%%%OO%&;&>%O%%%%2.^[_Looooo=OooOOOOOOOOOOO%%%%%%OOoooo....ooooooooooooooooooooooooooooooooooooooooooooooooo.....oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo+ooo@oo@OoO==C=+dSOO4d3d+e4=SeSFD=3=UF3e25dFSdC=4dLE4TSh4Sh4SJffSW`PgP gKsWsRPRSgWgssKQKKWQgh)g)IXIP''WKQPWW!I!K)@+o>%-7O%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOoO=OoO&OOOooOOOoooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooOOOOOO%>OOOOOOooOOooO%OOOOO%%%%@o+oe+F3=&O3D3Au>>&Vy;VVF-xVZyVyyynnxyyywFuwVyyVxVxuF6ZDFwGDwyyxxtZxnn>y>yudeeU^33=OOOOOwCuyyArvty6yxwywwF3CFL33uCeS_[)PIEYSLL2SE_)}WWK52CTy>>e3wuuVU/G;wxxywi*VwLd_L3Cs.L))[E.S44Sp2)EYfS44fffpUD3O3e3&>w&>%,T^6VVwwuuuyyyiyu33t>8>,w=<CSL2sKPKg!WI#sIWhSKh$@2ftyt8wxxrrruuuuuuuuwuutyywwwwuwwwwwwuuw>%;;;;;----;>8ww8>>8ww>>6wwww>>>weTSCVdyuyeUDVAuuyuwVC4SLTFiSTf+CD@42+2eDULL5sRSKP^{^.<OO&O-%O%%OOO%%%%%O-o45Fpo@+o=oOoO=oOOO%*OO&%%%OOOO%OOOoooo.ooooooooooooooooooooooooooooooooooooooooooooooooooooo...oooooooooooooooooooooooooooooooooooooooooooooooo",
+"ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOoOOoDU=ee=OOO3CS^D4EeS+Do=eCe&>Cee>3V>yy&VYdfFaSL42fS5RWg)IP)RKQKIsghKhKRgK'h'gIshhW{WRWW)KKRQ`)RR'# j`W @O%;--%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooOOOOO%%%%O&OOo=Oo=oOOOOOOwO&OOO%oo=oe2=ee>&iFy%%8wwwwuVAVAZytVVynxyyyxVZUVunVxnnnnxxxxnnAwnxxxwZrwZDxtxtxyyyyuedd3dUL2o3D^D-Znrtrvxtttyu;yUTD>>eAT^_TLLW)EPEDfLC3f^EPYK+3>;F/t&uy>wyDG-trtVtuyuu,CODH2sYh5S@R`ERH4YfdLHDf44pfE^SL^&3=eww&&&y>&DTuyyuwwuyyuwAuUT3A;VVO=e<YYh#sgRPI~RhQRh)PW'sX5.fwAyw6x68vrwuyyw>tuutyyyyyuwwwwwww>--8uw>w868ww>>-;>>>>>wwww>>>8wu>w>%Od)_2eeFLAVFdCdF,>wuw,H_UDfSYfT`_C=H=+SUCUL5SSshJgWIW$5eo=O%%%%%%%%%%%%%%%%+oO4i3@OOOOOOOOOOOOOOOO%%%%%%%%%OOOoooo.ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOO",
+"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo%OOOOdF>&==OOoO3edeTCodDEe33SFywVV&Vt;wAUy6uVAV32Lhfg2SgI}[PgI)K)Is!RI)E)``X{[!P)``']__]}_)W(RhE[sP)~sQ{' 5>%---%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooOOOOOO%%%O%O>>2oO=OoO=*%=O>OOwO%+oo=E)TF>wuuw;tG>8ttttyxnAAnyxnyyyxyyynVDVxVnxVnnnxxxxnntwAZtx88vrvctrtxyuwyyuww>V&d^Co/DDVuZc7ZrtttttyuViVVuueuTFO+=fSJ_)P)E@=CdO2JLS24u66mGAA;3OFy>>yADn6wyuyVVOwi+24_`^s22Cf+3CLSf+hJDfYoS4U)O^)eLO>>dwO%&wy&yuwwwuyyiVV>yD)F%,DU33@ofYLYIEKII!KIWI#PPW|gsIPs=wuVy86cwrtyyu3>uuwwwwwww86www8w88>-;>ww6>>>88>>-;>>>6wu8ww8>wwwtuuwuweUDCeVCFVDFCeww>&yw&Oi^YUYYECC^_^^4ffaUD2@4@shh'WSKX.+o=&>%%%%%%%%%%%%%%%%OO=ee3%OOOOOOOOOOOOOOOO%%%%%%%%%OOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOO",
+"ooooooooooooooooOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo%OOOO%333w>%%%3C===3D%3DSOOOdCCdV>w-Zwr6Znr%Ayww4.<42PW$$'RIWIRW{`kW{`'YE){Rg`~[}g# #@4so@+L_Q$gs#)sR'~[`..oO;--%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooOOOOOO%OO&OooO+@ooO=OoO>3=O%OuOoo=oeC>O;w8>;-8Z6rxxxttttZAZyyxxyVVVyyynVxZZxxZnncxxxxxnxVGDxZnwvvrrtttnDAyuyiyyFwyFw3ddD&unxZrZxxxvxVnywuyu,uiu>wiee5sf[)2S`dyAFddYSSSF66vvvZGVD^_DAyyuwVxAV>u8yyFeoe2S@Ef@opHLd<YY4S^QhfPfLLLeeL_FAOF&O=uuw,>dyuwwuuuw>yu3VV^d>yVDiS35YL_EYSLPPKPghRRRKWWWII)pCo=yutA8tcZZyueyytuwwwww6>>wwwww>uyw>;>w>>>>>>>>>>6888ww>686wuuwwVuuiydd3F==yuFyFFww&w,V&33=dffYdFCdCfS^YaDSd4+oDS.fI)'KP))EdoO%OO%%%%%%%%%%%%%%O%=>=&OOOOOOOOOOOOOOOOOO%%%%%%%%OOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOO",
+"OOOOOOOOooooooooOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOO>>>%OOO>Add=3=eFSF33=ydd3yuy;86DG%rnwn8>u4Cf5+4K```hK)Ih[{{PsWgf4.YsEE_'|E$.@.@oooo+@oLEao.5hR`QI'Po@*-%-%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooOOOOOO&OO&=Oo=oo=oo+OOooOO&OO3@o=3ye3dVVuwxx8;xxxvtvxZ8yZZVVVVAAVVVVnxtxZntxZxccxxxyyyyyAZ8tnwwxrtZnryAxwwuyyuVVAi,yV>V;yxtZmvnnxyVZZxwwxxuuywtxAAe2$h(EoDTC>DA=F_f<Cdw6vv;rDDD^^&3yyyuyV/TwyVnw>eCp2fs55o4oe_4S)pS{(KKgff@S)dee=CF&o3>=wuDGw>wuyyuw>&wV,DVCFeGF,<4d+4US4SEEfLLSYRJgKKIg)IjPKh.oCdw&yw9rtuw>weuuuwwuuw>>>www8w>yAVu>;-----;;;;88w86>>>-;>>wtuw6ZwwwwFF3CDdV3)ECFyeuiunuw,=CYCLLLULLf2dSET=o@o4Ld55ghsKh)Yh@O,OOOO%%%%%%%%%%%OOO&&OOOOOOOOOOOOOOOOOOOOOOO%%%%%%OOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOO",
+"OOOOOOOOooooooooOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOO%O&>>;OO%Oy>FTyu%w%O=FLUd%uOAwuDD686w-w>;EE2SEs^{}gSRsKWI_{^.@@+oeo@@4SRWE)5@@@oO3%O2=oO@4ooLSg| P'#@=O%-%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOoo@o=@oOoooO4OD=O=%oO+OeAVwO&yVy6wrtxmcxvlxZZwryVZVVVDFVyVVnyyxnvrnZtxxxxyyyyyuuy8wxt8xttAZwt8wuyyyyuwVtuFVwAwVytttZvxyttxVxtDxwttrrw9txA&eL`_SoddD>;u3d_5CCeyr77rxue>OuVyyu>>y&VFVA>t8n>FUY][f+ooo=id`TSsEEKfKYS=H`eCY=3oeeO>>>OAUyO>wyu8&&>yy>FwF>yGFi<S4@fSLE)LdFDLYWYLIPRIIWIgRIhLYD=Cw%->68www33www66ww8>>>ww6>>>uVxu6;%%%-----;>>6686>>->>8uyywwxwu,=CCedUdFu^Tiee,Vuuw>yDCdUfLfYES5452+YC=SLC2e<CEgP#JKsf2o3O%OOOO%%%%%%%%OOOOO%&OO%%%OOOOOOOOOOOOOOOOOOOO%%%%OOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOoO%OOO&>wu>%%&DFA]Du%u3>&eeFee3TuwuwOt;;yOw3O2ffsK2EYSSPKWKW)_S+2=O%xOw*O=o2S.DdooOO*O**OO=uoOo2.s'[R|`h.Oo*%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOoooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooOOOOo&Oo+F@oo=o=@ooOT_=O=O3oO%VFuywy6tw668rcvvvvxxxcxttnVxyVDAyuyVxtxxxtrnZrxxxxyyyyyywyxrvvwtwwyxttVVnuwuyyZ6xV;wV>wAwyV6tnyyytynxtDtrxr6tcMr;V3e=E_2F3u-Zt=3Lof.UL,wrwwV33Fy,yyeeCwFy3uFUyvvyi^)YS{E.42=OO)(fShLKSR)EfSU4d3CeOeD`T=&>>>>>d>ww6-&>y>3u>uF3uFid3Uf2fSYLdD3DLDF45s5hRPhPRRRgW^WED2o&u>6wynyu3uytw8ww6>>>>6>;;;>>>>>>;--;---;>;>>6wwww>8wuynxyxtuVu>3%eFewFy&,e33&V3wwdwwefYdffJ422Cf@fJ5fJLJ4DLTD^RIpgg25=OO6OOOOO%%%%%%OOOOOOOO%&%OOOOOOOOOOOOOOOOOOOOOOOOOO%OOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOO%%%%6>-6&Vyi&>w3O=>&>3LDUF`deOwd,%wd>==Of)^SEESsPIgI[Wgs@o**O66%%;%>%3o@+oaoo1OOO6%Ow*O*;O3.S)g`{')@o@*O%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooOOO&Oo=JE2oeE4+o3@o_dooOooLFw>u>Vw>uyyxAZtvvvxxcxxvnttnxynAAVyutyyyxtvxtxmvxxxxyyyy3Aw>t669tuuw8uywVVu;%;wurZZwuAAyyywyxwrnyViyyxxtrrcZl9vm9MGGw>e_SoeF>r;rCShK5#f`DuyA>e3d&Ad>Fy>wd>3AV&,FGDGAwo2f^]Loo&=OsWLsYISJ_SQ_4==Cd=od^3dUC3O33%>>>6w6>>wy>yA3DFdeCCf2DCsS)T24<DSV=DF3fSh#g!|{[WKRJgJJddyO--;>wuuutxywwyyww>>68>>>>>>;>8w>>>>>;;>>>>>wtyyu6wtyynVnnwVVww=oODCAFy3Ae33wiwwnwwii4ffUaL2f222aa_Y+sF<FUTCd5E $R_@o3O%%oOOOO%%%%%OOOO+=y>OO%OOOOOOOOOOOOOOOOOOOOOOOOOOO%%OOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOooOoOO%,>-;w8;6%O,&Vy%>=>&O>=DALd+^^=d>V>33e++oS)aSfgs$PKIghgX o=OO6%%77%%%;O=O+ooO%OO>-%-;O%%%O&oo)[R){g[g.oO%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOooOOOOOOOOOOOOO%OOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooOOooOoo=oY[]4LC@+YE@=ooO3CU,Oy>u>uwttxnttZMmxxxxxxctvnxtVDyyyyutxntrxZxxmxxxxyyyyyeUV>uwrvuwyy8ux8;wyyxnxtvr8xZuwVVwVywZttyyyyutttZxtrrmc9vMUZ>>S]543wut6v2aLPp@5E_y,D33<aVwiwC3AdeVCwuCy>vx]TuS42fEL@=O%&@2EhhXSRSLLdFFTTd32CSd==Ow&O>DUO;>wuww,>uVuwF33u<DUSLYE_L55dYHuiGDFDLPE)Kg~`WPsKh|J@fSOtt8;-;wVFwttwwyyuuw6wwwwwwwwwwuw6www8>>>w88wuyxyy8uyytynVtwFy&u332e=3y=A>3e3Cyu>AFVie=@=fL(5fo4ffLYSSE)LLwO=Sf5KhPR2oO&%%ooOOO%%%%%OOO==2UV&O%OO%OOOOOOOOooOOOOOOOOOOOOOO%%OOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo3>3dCy>&o+oe)C+=3eo=+De+%VOD^iO>VyVy>&w_E++5ss#KSE`{CO8%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&=@[{[{K 'Q.+OO%%O>O&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOO=yVdCY45{(o4D+@oe@d3e-6rtttrrZxxxxvxZxxxxxxxxtxxxnZG/>Vy>uyuwttttvvxxtxVnxtyxuDnuA>Vwvxxtw334e3wyynm9w8>>wtxxxxytxZVyyxxyttttxyttyytuww8VuuA_VVy3,>,O3=OeDuy>;;-t8xt9ZtnVA3ESYS4eewywf`D=dLSD3O_D%OOOo<S^`I hRQsh2eDV+4+VDuwnnOyCo@5+&OuVwuZxy8w,yL>>dLLWE^Y<=AAuUyFf^ShWJWRKPIgsKhYhLSfQfLhfSo=3O4e34oDd>uwVtyV%>=eennwwiOueeVOOO3@o&&&wyu>wwyOFyVVwVtUDww33>%Ou6%ZZDeyVw>uyuFV&CfFfL[SffSESDfSSf@<5#gsfh2T[F3O%%OO&%%%%%OOOo=o@oofa@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo=O=ede>>e@o@2e^^o+3oo=e3ww3wUFywywOOyiODD@4a_)5JE`)^w%O>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%O,o@_[h|) P`@@o=%%OOO&&;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOO%&OO>>*&o@oYeoo@o+ee3ee3;6rtttttFAZZxttvxxxxxvttxnxtttZUuyyuuw8tttttvxxxwutyxxxxAGwwt8xtlxZVVADLEC=wytvm>---6tyxxnxtynxuyxxytttyyyytttxntAywy8u]DOwVwVOieo%=>=yy8>y8tTFxZtnwFT_D4dCiyAFAVD3ACCiTiLDdo<w==oo+L))REhgfdDdULoYT>>D-tDy>de@2FDd,u6%6u68>uA>3e^T_L2feiV8VAwedfS@ESEPshSEKWP5YKhKP4YfLLSS3FSoSe3ED=y:wwwAAwedCnw&yuwyw3*=3+@TTAVwwu>&wwywV>VyVyuDVy3ye>Ou;-x8DCeuwuVZwUVu>dUYdfDfLf2YSfff4+5FL5s$#s4)L==%%%OOO%%%%OOOO=o<o2ff@OOooooOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%OOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOoO3u33wDC+oooL)Y3444=oo>OVVuF>&%AVuAD>T34SfLLSJLL+oo&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%O@S`IsRKK{So2O%&3>&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOO%OO%%OOooooo=o==dUde=d&66wrrrrtZxxxxttvxxxvttrrvxvvxtZDVwyAVyZDyvtvvxxxxtttxxytTTtZyyttZv8wyVdeLTUywxv7>-%->wyxxnnyyyttxxxytttyyxxtutVA,yw>ni>^[U3Vue>LU&3&Owywuu6%;GAtrZA&CSD3SLUdFUV3w,nw&ELC=)FS_).+Ooo<.2W_^L^TSdF]_J_U&;nw6xOD^doCUFVu>tx6w88;w>>wSKYsS22iFntnySH4pYffRfS^#IKPW^_RLLKPShh+fTCffeS3fJ2OO%u%wO>S*3aayu%i>wyeded+@S__Ay>>w&&u,%>%>Awuuyd=d3FCO=uwyy-udew3wVV8iVw3LL2Cf2d3d+pS45=d5SffK5sSJYUooO&OO%%O%%%OOOOO=o25oC4oOOOoooOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOO=>>>w3Foo3ooL_C3F=+oDywD/AL3D,Ai&&VG_=eF4pS@$@+22OO-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6%&o.E[WjWW[_==&&O%>y&&&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOO*%O%=ooo==o=%eDueuDV66688wrrw8rtvttxttttrrrrtxvxZZZDDVADVunZyxvvvxxxxytyxxytAZ-ttttt-7xZVVddLDywnnrvu8>;6uttxxxxyxxxxxxytttyxxxtttVAyuyywiw%U{d=&w,<SOOOOww>yF-AV6VtnwUDeiSd44DfFYFdm6Zt>TD<<YL2R]W &OO3@O@o4UESCS^_f2U>ww%8-V%>e24oyO&&OuA>86>&uO>3Y)L444dA8TG8TD4g5LPgKKY`WSPIsgJSYYsh@E`SfYUDLTLUf^fSUwdAD%yTCdfo8i,>&&=VF=CdT`a+u>%>u>;yw&uwVDyyVLFCLde+3Se>>wyUdedVy>wiy>ye=F4FE3C3=3Ff4@+ffCfhJ2hhLL+@oOOOOO%%%%OOOOOOo4o=Y<o+OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOO&>&eOOo=23=+fS32o4OO>Ddu&Dy3&3>wO><CLS$P`YJLS+OOO;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%-oo@_{RKKW_@oU/A3wA,%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOO%OOOOOOOO&ooO=O>wywwyAVwwwwwrttvttxxtrttrrrrrtttxxxZxtZDyyVuwywyvvttvvv8wttyxVZFVxxZtZxAr8FT^UdddwwZZvmxtw8wtytxxxxyyxnxxyttttyxxytyyxxyyuiwwF,3E[3wi3w=y%OOOOwwA;UD>wt%wAOwCeCSofY^)LocrxZtVyefsSs R{hoO&OO=>=O&3LE<oo=odyuy-6;FZuOeL@O>%Oww;6;-%%y%>>YWg##f<;nmAnV<SWULKs_K#SKKEhs)EPPLRh]SsSLfLUfLCCffffLSeTEdCYDfL4iGF,DVuDeCODS===,>&>w>&w;wyVVwwA))DffCffoFYdOdy_dCFFy>wViyV32UCdUieee4ii=3Sf2+L)SLffJ.+o=OoOOOO%%OOOOOOOd<=`)oooooooOOOoOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOoOOOO,>uVO&=oOLE4@o5oO&==D=eudVw>Ouwu3dJ4LLW({{[T3,6O%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%>%@.s[Ipp[`oo3wOOO;OO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOO%OO%OOOO%O=OOVwVyuVwyw8vttttvxxxxxxxtrtrrrrrttttnxxZxtxywwwtVAxyttttttt6wtuwwtxZwy6w-t8rrr6>wCDwDDZxZcrtuwwtxxyxxxnnytyxyytuutyxyyyxxtuwi>wV>iiee([)^eOuD>&;OO>ww>wuyOuA%ADydCefLfY{[fh6Attyyi4p@sfhP[{E&i,OOO%&O<32.5Yd=wV>--;r8tUUdSL3wyiu8>->--&iy33#s)Khf,Dvv9n8SSWfJf^LffShh gKS(ghPPYLKSLsEffLLiCfofLUSCeS23ff5LfCHF3TUdSSOFC3O*3>w>&>>&,,u>wyu>y+do=4SffSS@4DYeewCCeeyuu>y33DJ+d3U3Oid4dFe42SLYSg5J)S2.@@oo%&OOOOOOOOOOOS=d[2oooOooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOoooOOOOO&yAw%o==^`ELo2o%=3>F=eOD_)D3e==4S{^<E4+LE_EOO>OOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%-%6&O2oL5fh{EodoO&>>&>&&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOO%OO*%O=%OO&OOwVywwZtVxyxvttxxxxtttxxttxttrrrttttnxxZZxZVZxyxxtttturrrrrtttw8888w;uutZFAAZt>;yDTTAuVZtrxuwwtyxxxxynAAZxtyytuwwttyxxxytttVAUVieww<d3H]_@4;uOO%>O&uuwO%yOAnOwDFeeSSSR^^EL+nV8nFeed4sEP))gP4f)dwZ;%%OCS++S`doOyDVwZr6;ww>eduOuA&%w%w66>uF>3XhQWSCV6cvGTyYSXLRh2LKI5ggh4#$YKLLgISsLPhDSCCELHSUYSfoS2fSLEEYESei3&FD33DCYFOo1O&w3&>w>>Vy&>FTyuFSe2+f5sYE.53@3=>dy>wyuwC=ed2=ddFUCeOFTf<dSCfsf4@$5[L.4oo@++OOOOOOOOOOOOo+ooo=o@OOOO&&%OOOOOO%%%OOOOOOOOOOOOOOOOOO%%%OOOOOOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooO%%O-yV;O%=&oSS^^f+@%O=V=33eC]_yeDe3_UE]efs2+CdOOwO-OOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%--%O&+oo$.S[2=>OO>OO%FV&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOO*OOOOOOO>%OO6-nxxnxwrxtxtttvxvtnxxxxttvxttrrrttvZZxxxtxtxtwxw6ytuwwww8wytwwwuw8w6wx;Zy6rrtttyyyuwVZwrxruwutxnxyytVDDFZxyttwwwuttxnxtttxwV_L&LET3e<e`D3<&&w>O>OOOywe333DAO%wOeHf424s4LYseCSde34efSSf{_@@2^[+,VO&&=O.2)`'^OO&V,>-8>Vu>DG>33wuu;-yt8w&;AO&hg}WKDGnvMGniSggU<ffY5hIPSS.LJh'R$KhPg42)^S^UCLC4E^fEYLhSLsSLLS5Fdee4Dd4eCoue*>>>ddwwyw>>,w>F^Vieff24SSY^R@5=4=e3yewy33d3LL3fCC2DD==edLS422f24sgT+_E4..oo23OoO&OOOOOOOO%OO3@ooooOooOO*OOOOOO%%%%OOOOOOOOOOOOOOOO%OOOOOOOOOOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOO;UTwy;O>oo=o4L4o3e3DUee=de==3=2=DaoLY2<4fe=OOO&&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%;---Oo+..@LEo=OOO3y/UOuD%%%OOO%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOO%%%%-wnuntwvtwnrttvxvttxxttttxxttttttttxxxxxxxxyyytttttwnt8uw6yxuwtytw8u88yAAx6xvtxxVVVVVxtrrrr6tnxttxxxyyxxxxyyxtutxyt8yxtttxxuw3wiAFFeV33^_o46wVV&O;&ODT=L3+e,OyD333epffLDhER42YE)^4ifC3D)T3i5^]dOO&&>=+.|{'W_=%O>%O%%%O%%&>>eu>>,;-ww;-&OA^^Is)_KUDvmmmZ3SKILfYhPsS^)WX#f$LKSKWL5SS+hSYEH2dSe+4LLLLYWfLshSSSCi@CLfeeCO3y&1w*w*3>3>%VCuFu3wyeTEJE`L+Yg$Sf+=@3yduywwFCeTCeee2+edTYdDCD44LfEL45D^Eo@@+.({_oO>OOOwOOeOOoOOOOooooOOOOOOOOOO%%%%%%OOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOAZD&O&wO3Oo@=^]4odoofddCS4Oe42=S@=SfDd2=SCw=%%OOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%-%%%=@5LY^Y4o3O%O>wDVO>VOOOO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOO%%%%%6tntxttvvrvrttvxvtttttvvvvvrrrrttttxxxxxxxxxxvtttttwytwuwwyxtutxtww6yAFAnytxxvxxnnnAZxttttvyxyuuynxVnxxxxxxnuwtxtuuwxnyttyyuuuuydAAuye33_S3;>tu%O%OOV32OdeYUDUD<33e2CEU_hYSg#SE{{44De,yt8tAR25o=3=oo=+`)g'!E+oeOOO&%%%OOO%%&&OO%%%-%%%%OF_`ER^)KSDZnrvuCfhP3EYS)f5YRSKSSKgSKSPSSgSK4f@+S2f^eYLh455fshEhLRYhLEf4i)dTC3SD3>1:=&3>3yyVFwCydVdeffS^^SE)f+s5+4=>=DUdwdDeC4CCdf3LC=L^d5YdSSDsLhfY][5o@..E[__=o%O%o%oFUwO@OOOOOOOOOOOOOOOOO%%%%%%%OOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOO%O,yy&w3o3o=od)LSod=odSUFSD42d4ad=ddC5+23=oOO%%%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%6%O&O2Lf5<o@=%&%>>>&O%%OOO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOO%%%%>wtxxttvtvxrttvxxxttttxxxttrrrttttttxxxxxxxxxxvtttuutwuyuuytyttxxttt6xAFnuwtxxxxxnxxAZxtrtxxZntuynxtnxxyyxnVtDUV6tx8txnxttyytyiyuyiVyyudO`YO6>ww-%%OOOeFCFDf{UoOee3CeefETEEsssW)``EDDiVAnxmv4SS2HSo53+_{^W[K^`@oe=OOOOOOO%%&OOOO%%%--;-&OO&OhLSPf5CynyFAegKRoTL<EL5WRghISLg5$2@2f^EUH4fTUCCdiepS@fPspfLYP5gLf2f<LYd33*AF>*>>=3>=OeFwD>3>dVVy+2dYLhYa2o2++w=e33w3SCU_SfD3SYe4S4ULf2SY2^^f2fE`^=2o@@S]4.DoOO%%dF==e&@oOOOOOOOOOOOOOOOO%%%%%%%%OOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOO>OO%%U/OO=OO=oODf=3fof)LS+Ld5+2e5CoC3fSCVe=OOOO%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%-;OO=oo@2oo+&O&&%%wOO>OO&&&%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOO%%>6wutyxwtxwtnrttvxxxvtxxxvttrwvvvxxxxxxxxxxxxxxxxtttrwt>wyuyVytttyyttxyyyyttwwxvvxnnnxZxtrrtxxnxyxnnt8wwttxxVZtUTZ>yn6tyxyttyyyxnxytyyuVwAd)V&rwww>&&OOO2F]YSLf4=iCedVyHS3+=fpWIs@.C[`DAurZAcvi<YU@E)<Ed^EYE]Y@^_Soo=oOO%%%%%&O%OO&%%-%%O%,,>==d@4o@feey,DhEh#244.pY$$5fIsf2YfhYS$4LS2d2U_e3DC<3eSJPShSSPK5`sfP^YYhfS33o>3%>>:=3&=&VUCV>>=dydweSCYLC5+++3==>wDyid32CCSeoad33LS5gYfSS+LSEf@@SDoooo2..`[4PD+3O&O=dOooO=oOOOOOOOOOOOOOOOO%%%%%%%%OOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOwOO>O3Fdo=Oo3o>S5o2F42Y)DEY323=f^YD+DUOde3>%OOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOO3+oo2.5+O%>OO%O3OO,O%w,>&%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOO%>ynxyyxywtx8rntvvxxxvvtxvttttttxxxxxxxnxxxxxxxxcxxvttrux>wxuuVytutttutxnyttyxtutttxnZZnxvtttvxxxxxnxtw6;8uyyyxxVtuxntw8wwttytyxxvtyyytt8ZtyuAOitr86>;%Oo3=oSEE@SL@eA,d&OAU&CC^EKY5hYFDOuiyr99vmV3ei=TT2ED33deLeL4J`_))OOO%%%OOOO%OO%%%%%-%OOOO3>=<f+4f2dDeS4PSKeDLU@fLfpKY5$gSSYLf@TSi=@Oo,33e,eU``_[`[`KhpKPYJ)`s)S2+Yd*>>*q>:>=O>&wDw&3deCee>%Se3d^f3d3wew>wUDuCUeDDf4CfdLe3D#KJKgIPffsh)^YLoO3=@o4[^5^4oOO,%oooO=ooOOOOOOOOOOOOOOOO%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOooooooooooooooooooooooooOOOOOOOOOOO%O&dACO%&OO>%2_Do2o=@d2CU2LC2f4f==dd=%OO%%OO%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OO@oofSo4=o%O%-%%O&OO&O>ww>%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOO>yVyuuttwtytxnxvvvvttttttrrtvxnxxxxxxxxxxxxxxxxccxxvtttVutiyuyitwwttuttwtnVxyttttvxnZncvxxxxxxxnxxyw68w>wtxytuunuwynyuuwwwtytyxxvttxnvtttnt>>wwrt8>w>OOO=ooo2f@sL<DS&unwuVA>LUe<Se3TTwVu8DGtyArrZxnwe+3DD3y8TDn^UCDY]TU@oooOOOOO%OO%%%%%%>&>&OO-%,CfKSSYf242)}gdp4C2KKJLSgE^L@o45SE4<LESTTFU,,wu<^TdLSEWKK)gPS42KsSf42+e1u,*6>q=&&3=>3o=eded=eduVe>w_DOF3=uu>wZuUVe2FFSSUS4^T=SR))RsKhX#S_{)2o.OOoo=L].SJ++O=%O=+oooooOOOOOOOOOOOOOOO%%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOooooooooooooooooooooooooOOOOOOOO&=O3Oo>^F3OO>&O%<LES+o+22@4E^YadE2<3CeCCFy;&&%OOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%o+ooT]`L^S3ewO8-%OOOOOO&>&%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOO&wyuuuuuuuxAAntvvttttttttttvxxxvvxxxxxxxxxxxxxxmccxxxvyxyyyVyVFywwwttutwtxnxytyxxxxnnxvxxvvxxnnnxyyu66w8uxxytttuAFxwynxtwwtxttxxvttvvxxntnyyuZ&rv86yw%*Oo25.oQS4Tde=y;,yDAtiu,VyVVyFEyyAwVAuyAuvMttuyyC^^wD9vvlSfJ`P4@L4=ooO%%%O&%O%%%%-%OOO>OO9-O=4KP)s4SL4Y[se5CfpS+RE5sf^@LLLDL^o+CdTYUDDyV>Fdd3DL.KISg]PK^hshKY544e3=w>%>>rO&wedAdewe3wdOeDyO,A>yOwV3>u88t8>F3LEedED+4DdSE^P`{`[`KW_ESS..++&Ooo@))sY5ooo&OOoo+oo==oOOOOOOOOOOOOOO%%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOooooooooooooooooooooooooOOOOOOOO=oo=o&OyOO;OO>OO+oFES@=+4CSU`ESdJL423DECTF>OOO%&OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%oddfDh+@2Se%Uu--%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOO&>wuyyyywywxDDxuvttttttttvxxxxttxxxxxxxxxxxxxxxxmmccxxxxwyuyAVAUxw8wtttuVxttnVnxnxxnncvlxvttttxnxtynxw>>wtxxytyxyttxxtyVyuuyxttyvxxvttvntnr8u;tt6r66yw%&o=oo@oY^SL<fFUuUG8wnuwuyVnuDZD>VyVuuCy3dbMvxZieeeDwrMbMMp2L^UEEDDf2ooOOOO&%O%%%%%%w%O&O%-9%<f4$KsRSEK5YRLUdCf5S`L.s5hWS424+oDo+=ie&F&iniu&>iT_S5K$E[K4EYKLf4KUD5dw3**wqtwed=3d>333>CDO3S8wy&>yeAwwyn6tAriuFTY<U4f)SFFDUes')){'KPIS2ooo@oOOo=of{YL2.o=oO%=oo=Ooo+OOOOOOOOOOOOOO%%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO3C2@O4oO@O=oOo+ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&=dD+@@$gs#P'K5)Y5fSg44L]FO%Ow%OOO%%%%%%---%OOO%%--;-%;;%%;%%6%%DF&OOoOO=FUULF2wwO=O3OOOO*O*OO&--;%-%>O%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&%OOOOO&;wxtrrtxtrtvvrxZxxxxxxxxxxxxxxvttttvvxxxtxxnnnxxxxxtxnxtvxxxxtw6wutttyyyyyxxxnnxnxxxxvvvtxZxttxxyyyyw>>;uyyuuuyynxxxvttttvxxxxxxyyyyyyxxyAZ8;utw8rtt868w>O%o=+2)KK54f2Le&yd,nVwwy>AZ^UxtxxxxxxxxxxxxxxxxyyyxxxxxyVAAVVFD/D>OOO%%%%%%%%%%%%%%%%%%OOOdTfWg5WshI 5_`ffC4DLfh5fYf$5Sg#g2deOCCSE)544<E^fYf5dLEe)/OVVyDy&%L]D&ewud&3DV=ee>ey=yu,VVwtt6wwwwwwtyyy8;yw%FLDLf4ffshY4fdSDT)D]^[T@OOOOOOOOOO%&Oo=D^oooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoS`Fooo=O=oo=@ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOw&oo^Do$XgIs)_5KE)@LSsYfLf+&&%O%OOO%%%%%;%;%O3=O%%>%%;O%;%%%%OO>w,O>CyO%e3edCSLDDC=oO%OOOO>%%%OO-rn6%OOOOO%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&%%%&wtytttvtvvxmcxcZxxxxxxxxxxxxxxvvttttttrrvxxxnxxxxnnxxnxtvxxxxvtrttyyyyyyyyxxxxxxnxxxxvvxtxnxttttuuuww>,wuyyuuyyyxxxxtttttvxxxxxxyyyyyyyyuVVu8ttw8rrr666w>%=oooa`KsofSS<ES%3Au>88ywDFUAttyyxxxxxxxxxxxxxxyyyxxxxxuyyyyuyVTF,%%%OO%%%%%%%%%%%%%%%%O&OO45SsIKfIKs)^hh2@4fCSaLfo$YYfIshCdCdC4^PKLLULsLTYd3DeddLV>>Ow>=>=OFOe>>>3%wDVU^Vee%du,wu>>DGZrrr86>68y;nVw>VUL225YS+hhaSEeL^S4dECaoo3OOOOOOOOOO%OooeDoOoOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo3@oOe]Uo2oo@oo+ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOw&o3T)h$fgPWQKXKgLXsS@@K$fpo&=&%OO%%%%%%%-%%&OO=OooOed>=O%OOw&O%&OO>V=O&OooOo=eeDdCdFOO>OOO%OO&O%>8wwu3=OOOO%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%&%OO&xxttyxxrxxnZmvvxxxxxxxxxxxxxxxxxttttttrrxxxxxxxxxZZnxxxvvxxxxxxxxxxxxyyyxxxxxxxxnxxxxxxxxxxxvvt8ww6>>>8wuyyyyyyyxxxvtttttvxxxxxxyxxxxyttwtxyttuw88888888;O=Oo@L{`_Y_K+DLouuwwttAV>VxunntttttvvxxxxxxxxxxyyyxxxxxVyyiVyyyAw%O%%O%%%%%%%%%%%%%%%%%OO%oohgY)sYsREh'S4+LY4@.fh@.@25S#$@LDdwdT)4fSe(Y+<oL3=LT+C>&e&Ow>=OOOFe3we3*OuA3eAe&33>>y>>w68w;xxttvyxyywAAVAy&3e4LD+(J2J^]TJD=@3@oo@3oOOOOOOOO%OOOOoO=oOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoO<o=]^+4e<o+ooooOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOy&o=^Qs..hgQI)KIgRXphsILYY<+oO%OO%%%%%%%6O>>o=OY)^SSLd3EYeooOO&O%%OOOO*ooOOoooooSTedVCOu=O>O%y;%-O%%u&oOOOOOO%%OOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%OOOO>ynnytxnxtnxxxtr9rxxxxxxxxxxnnnxxxttvvxxxxxxxxxxxxxZZZxxxtxxxxxxnnxxxxxxxxxxxxxxxxxxxxxxxxxxxvxxr6>>>>;;>6wyyyyyyyxxxxvttttvxxxxxxyxxxxttwwwtxywwuw866www6u&OoOod^))`_US^5+TH3,i,;yyuywZxtttttvxxxxxxxxxxxxxxxxxxxyuuyyyyy&OOOOO%%%%%%%%%%%%%%%%%%;OOOo5+YK@KSg#S]SffLSsDSYf+SEYs5_`WEAeU`)dspfLH<2SJ4FCDC@=O%%O;OO%O&OVAwwy,&yDUVde3O&>Oww>>Vu%-wrrwrtxxyuyyA/ECdeC3oooS@4_^fo44O@oo@+o3oOOOOOOOO%OOOOoooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO=oooo=oo@L_^o+oeOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>OO3^esYWWhR|PR`PWWhPs#hsf`Lo=oo%%%%%%%%-OOOo@e=)`)LEYsSYfooo=+oO%OOO&*OO%%OOOO=3dSFSCFDF>=w&&u>O&O&O&oOooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&yAuyxxxnnxZxttrrrvxxxxxxxxnnnnnxxxxxxxxnnnxxxxxxxxxZZxvtttxxxvxxxxxyyyyxxxyxxxxxxxxxxxxxxxnxxvxxr>;;>>;;>>uyxyyyyyxxxxxxvvtvxxxxxxyxxxxtuwtwtytwwtrw68rrr8y>%oOoo2hss$Yd4<3Cei&yVyOVwuwVwVtttvxxxxxxxxxxxxxxxxxxxxyyyyyyyV;&%%OOO%%%%%%%%%%%%%%%%%-OOOoooh^YSK5.LUf2$fShKE4hYYJSLLRYC4wADDdSSCfddC=L)dSUeo=OO&OO&OOOOu%O>w>3;OyUDyDD3CdOw>&w&>>>ywlrwrrtuwywwFTUDEUd=o@+=.5Leoo=Oo=o=OOoOOOOOOOOOO%OOOOOoOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoeoOO@+=++DCo2ooOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%e^ff5){[P|Ig|[`)[WKgs h)Y@2+o%%%%%%%%OO>o++oEYYhpLK5L^fo@ooO@%OOO%%OOOOooooo@o=@=3FCCF3V3>O%OO%O&O=ooooOOOOOOoooOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%>w>wyxxxnnntrtvxnZxxxxxxxxxnnnnxxxnxxxxxxxxxxxxxxxxxxvttttxxvvvxxxyytttyxxyyxxxnnxxxxxxxxxxxxtxxt6%-;>>>>8yxnyyyyyxxxxxxxxtvxxxxxxyxxxyttwyttttwwttrwrrtrw>>&O==@+LK5+YDoeodOe,uD/^^UAVn>tyyxxxxxxxxxxxxxxxxxxxxxxVVVVyuyV>;&%OOO%%%%%%%%%%%%%%%%%O%%O*%=22dho...)a.5LLf22ShLLhgYLs@5C&wULCi54DL,G23eEUSS=&O>O%>O>w%O%&&;%u33%wDF&Cd3CV&>=3wOuA>>%rrrrtttty3dewFSC>oodoo4odCo@<oOw=oOOo3OOOOOOOOOO%%OOOoOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo@=oO=oo.ooa<3+OOOOO%%%ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO-OOO=4sgsYRRW)gKRRgIs))WWPsLKo.@%%%%%%%OOO&o2@+)hQEf@5544oo+=OoO%O&&OOOOO=OO=OoO=ooCSdeDDCT>w&%&=%OO+ooo@@@OOOOOooooooooOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OO%OOOO%6ynnnxyxrrtxcZZxxxxxxxxxxxxxxxxnxxxxxxxxxxnxxxvxxvttvxtvvvxxxxxxxyttyyxttyxnnnnxxxxxxxxxxxtxxvr;;;;;>6wxnnxtxxyxxxxxxxxtvxxxxxxxyyytttttttttttwttrrrrrw6>%OOoooo4ECf`E=U)Ciyw,UUU>>unZZyyxxxxxxxxxxxxxxxxxxxxxxyyyy>%%&O%%OOO%%%%%%%%%%%%%%%%%%%--%O%Oooooo=+S^.SEYaaJ$4fSfSSh.YRdHy&uy33=DU<eyd4=T^3YoO%OO%%O-O&&OO%%&u&ywuUUADee=O3&w>3&LTw>y;6788www>wd3eLFoOo>o<2o2+^LooOOOoOO&O=O%OOOOOOOO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOoo=oO=@+.2^dFeOOOO%%%%ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%>%C22WhIhgPRPQWQKRg`[)KhI)If2.%%%OOOOO&oo3od)CS$hLf2$+o2OoOOO&O%%OO%>OO&Oo==oOo@+==oO4SF/O&%O;O=dee4DY@@@@OOOOooooooooOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OOO%OO%%>uxVVywtw8rtvvxxxxxxxxxxxxxxxxxxxxxnnnnxxnnnxxtxxtrtxxtttxxxxxxVnxyttyyttyxnnVVxxxxxxxxxxxtvxxtw86;-;6wnVVytyxyxxxxxxvvtvxxxxxxxyytttttwtyttxywtttrrrwww>O&%oO+@o<YS)[C)EoiiiwwyyuZywV8xxxxxxxxxxxxxxxxxxxxxxxxyyiyw&OOO%%OOO%O%%%%%%%%%%%%%%%%;%%>O>O*o3Oo=oTL.^EYYSLKf455S45fK]f=&>8Ai3C+Cw>&Se2DD3o3&%O&%%;O%O%%>%O>wOu>%ADi3V3ee3dO*AdDDO=3vxnxtwwuuu3eDfo+OOOO3oFFL^Ye=o%OO&OO&OO%OOOOOOOOO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.+@2U@EDOOO%%%%%OOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%-%>odYps)IXgPW)g )K`{{RWWKWYKK.;%OO>o2ooo=+oSE=hf@ffL<@OOOOO%%%%%%%%%OOUVOO&=&Oo@<o+@o=OO%OOO%%=CeeFS)`fd2oooOoo@@ooo+oooooooOOOO&OOO&OOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OOOOOOOOOOOOOOOOOOO&%yVyyutxtrtxxxxxxxxxxxxxxxxxxxxxxxxxnnnxxxxxxxxnxvttttvvvvvvxxxDnnutn8ytyxxnnnnxxxxxxxxxxxxxxxxZw>ww-;ttyxxnxxyxxxxxxxvxxxxxxxxytttyxxntyxttttttw8rtr98688&OOOoO@<oTD^`+S4TFiwyyiVyuxZxyxxxxxxxvxxxxxxxnxvvvxxvuyVyw%O%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&O=OO=3ES45PTgK45SfL4+ffX5fei>OdCe4de3>;S^d@wO3OO%%%%%%%%%%%%%%%%&%>uOVw&dy%A=dw==weFdoetrZ68V;u,yw3eO<oO*OooeDYLdSDOO>OOOOOOOOOOOOOOOOO%OOO%&%%%%&%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OOOOOOOOOOOOOOOooo@dod4OOO%%%%%OOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%O;OeEREW.LW)Is #KR`'`R{[WIIK[sO%yoO4o@+@oo4d324<24@2eoO%%%%%%%%%%%%%%OUV=%%OOO2..2oo@oOOOOOOOO3w=eo4D_Df2+==&O2.ooo@oooo=eoO=oooOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%OOOOOOOOOOOOOOOOO&AVwwuVxytxxxxxxxxxxxxxxxxxxxxxxxxxxxnnnnnnnnnnxxxtttttxxxxxxxxtwnyxx;ttttyyxxxxxxxxxxxxxxxxxxxZtwtw>6tyyxxxyttxxxxxxxxxxxxxxxxyyttyyxxuyytwwuwxtwrw68r6w6&OOOOOw=oDE5]LoFLf&ydFu6VZuwxyxxxxxxxZnxxvvvvrrtvtxZZyyyy,&%&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OO&OOoS{'.4@E44LpSSPS5hS5YY=O;,>iUDCCLi&FU=o>O&%%%%%%%%%%%%%%%%%O%%>u&DA>ey3D=3eCDo3D=S3868VV>>w>wwwyoOOOOOOCULeeLD&O%O&%%%%%OOOOOOOOOOOOOOO%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%OOOOOOOOOOOOO@ooooooOOOOO%%%%OOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO--O&OoefEhffsh2fg##gW''IRWW^_YhKD=oo<oo2<dDfdSd42e33LewO%%%%%%%%%%%%%%%%&OOOOO&>.+.4o@+O@OOO%&%%*=DdCLfDLSfCFd3O.+.2+@o5+@ooo+o&OOoO%OO*OOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OOOOOOOOOOOOOOOO%OuyuVyxxxxnnvxxxxxxxxxxxxxxxxxxnnxxxxxxnnnnnnnnxxxxvtttxxxxxxxxnxxZGGyxttutttyxxxxxxxxxxxxxxxxxZxtttrrtvxxxxvttxxxxxxxxxxxxxxxxyyyyyyyxtnVyuuttuuurw68rww6-OOOOO%OO+_S)^5LY23iVVVtyZZxnxxxxxxxxVnxyttyxVVZnutntyw>>&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OO=oe[^QY4+ffSfLf55JRYIP_ou>nD+2H^FidDdeoO*OO%%%%%%%%%%%%%%%%%O%%>w8DD33d>V&OeL]C@d+De>wuuwwVwwwwyA&%O%&%O>VCedTFoO&O&%%%%%%%%OOOOOOOOOO%%O%->%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOO+o@Oo=o&OOOOOOO%OOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO--O&>ooo25<+22a.s)P$W)gWh5IR.YEETL24foLYffUeofeo=eeL_FOO%%%%%%%%%%%%%%%%OOO%OOO&5W)L^24oOOOO&>>;Od/edLSD`)^^TS>OY[)`]YfTT<@34=OOO&OoOOO=OOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&%yVVAnyyynVxttxxxxxxxxxxxxxxxxxnnnxxxxxxxxxxxxxxxxxxvttxxxxxvttVx8wDDtttuwwutyxxxxxxxxxxxxxxxxxxnnxtxxtvvxxxxvtxxxxxxxxxxxxxxxxxyyyyttttnVxuwttw8wttrrrww8;%%%OO%Ow+i5E`_DS2FddwAZtynxVxyxxxxxxyyyyyynVwwuuyAFVu>%%OOO%%%%%%%%%%%%%%%%%%%%%%%%%OO%%%%%%%%OO=OoDSL_LY+4fSYfffYK4ILS2eyddC22f4LUD>OO*&%OO%%%%%%%%%%%%%%%%O%%;>6DDu&V>>>>>CLDEa2d3>;yw>yywyw>3Fu=OOO&&OOD^DV3&O&&O%%%%%%%%OOOOOOOOOOOOO%8t;-%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOoOOOoOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%-OO>>=+@oo<C)4+.LPKK# sKR5IK4_EYT^[`h]{Yff3dC=de=3DL>&%%%%O%%%%%%%%%%%%&%&&%OOO+Ys^`]YeOOO%&>>;u>O=3D3dd2@==OO%Y[_{{^fS2@o=)Lo+oO%oOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%OOOOOOOOOOOOOOOOOOOO&wDDyyyVyynVxttyxxxxxxnnxxxxxxxxnnnxxxxxxxxxxxxxxxxxxxvvxxxxxvttwVytyw8ttttuttxxxxxxxxxxxxxxxxxxxnnxxxxtvvxxxxxxxxxxxxxxxxxxxxxxyyyyytttwyxt88wwVuwtvvrw6ww6>&%O8%O%o2YfY[`L4dw=iyyny86xxyvvvvxxyyyyyiiiyVyuFDFVw&%%%%O%%%%%%%%%%%%%%%%%%%%%%%%%OOO%%%%%%%-OO%&=sSoRY5SSSSff42sgghEoeC3==f2.LLe3OO=&O&%%%%%%%%%%%%%%%%%%%%%-%>AFdOdy>we33ofLDD2+e3wTUedVw3wOuw;O%O%>%OCTCoO>O%8O%%%%%%%%%OOOOOOOOOOOO;yA86>&%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%OOOOOOOOOOOOOO&O&OOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%-%OOOooo3o3dADE@@@+YRhPfgE+++42fKYKSf`_)LLYDd&&33=edd=>OOOOOOOO%%%%%%%%OOOO%%&=..2SYSJ3OOOO%%%%OOO3=oo=OooOOO%> hggo.oYS=ooSS=oOoOOOO*OOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&AAyyyVyyyxytttxxxnnnZZxxxxxxxxnnxxxxxxnnnnnnnnxxxxxxxxxxxnnxxxtZVZywxttttttyxnxxxxxxxxxxxxxxxxvxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvvyyyyyttttyyuwww8DZwwttrw6wwww>&O%-%%4o@EY.f`H^^iVyyyVDDtxyvttvxxyyiiiyyyVDAwAA>%&%O%%%OO%%%%%%%%%%%%%%%%%%%%%%%%OOOO%%%%;%%&OO=OSLhp2YYYEsf2LSPSsIgLCUD=4+5K_UooOO;OO%-%%%%%%%%-%%%%%%%%%%%-%wVAyOeFe3e3=FdoUS+2=CoLT=FeuVA&>68w%%%OOOooOoO%OO%%%%%%%%%%%OOOOOOOOOOO%>xAwww>&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%OOOOOOOOOO%%%O%O%OOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%;-%&OOoo3O&%>UKLh.LEoSsSLKY2@2@+@X5$sp55SDeyV>o4fCLLoooOOooOOO%%%%%%%%%%%OOOOO$..@..+oOOOOOOOO>%OO>O=oOO&=*OOO$  ..5+@o+=OSU=3FOo=OO&OOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>*OOOOOOOOOOOOOOOOOOOOOOOO>uyAyuxyuyytttxxxxxxnnxxxxxxxxxxxxxxnnnnnnnnnnxxxvvxxxvxxnnxxxxtwxwtF8tttyxxxxxxxxxxxxxxxxxxxxxxxcnxxnccxxvvvvtvvxxxxxxxxxxxvvttyyytttyytttytwAxwwrrrr8rwwww>%--%Oo5.$S)she^HVyiAyyTTuxyttttxxiiyyyyyy>UD>VwOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%OOOO%%%%-%O%&Ooo$sff@o42a2LhfS'[Kp5hYTS=+2gffo@OO&OOOO-%%%%%%%--%%%%%%%%%%%>%yyxuDAdy3>3O22dL<<2eUeFUDUFFFDwuwwx%%%OO%%Oo>&O&%O-%%%%%%%%%OOOOOOOOOO%%;rx8rtw&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%OOOOOOOOOOOOOO&O%OOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO;%%%O%OOO3O&Ou;O@SL)ELg.@hf.`_d=.S@. #gRsLdow>OwS4LF+3o+oooooooo%%%%%%%%O%%%O%%%.+@@@2o@oOOOOO%%O%%%O=o=oOOOO%&% $X.o.+.@oo3oFeCE=o=OO=OOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOVu&OO%OOOOOOOOOOOOOOOOOO&%uuwyuyVyutyytytttttvxxxxxxxxxxxxxxxnnnxxxxxxxxxxxtvxxnttxxxxxvxtyZ>wUAttyxxxxxxxxxxxxxxxxxxxxxcvvnZxxZZnxvttrrtttvxxxxxxxxxxvvttyyyyttttwwtyt86>6wtttrrrw8ww,&-%%>o<+oS[P2f@=eiwVVwDU8xyttttxxyyyeyddVF)^DDeOw%OO%%O%%%%%%%%%%%%%%%%%%%%%%%%%%OOOO%%%%%8-OOOO=L22RJ@$h4$L^h4shsILTfodCYES..=@oO&O%>O%O%%%%%---%%%%%%%%%%%>%yuuy(U>ee333L4DSf+4224<DL=FUAA>xt;6w%%&%OO&OOO%&%%-%%%%%%%%%OOOOOOOOOO%%->66rtw&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOO>uw&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%O@oYEFLYJ=+@TE253)Lf5fE_P4a+=V>tFOwweO@=OOeO%%O-%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%O%&>wo.@oooo=OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooOOOOOOOOe===o=deOOOO%%%%-%OOOO%%=%uDuyuyuyyyttyytttvxxxxvvtvvxnnxxxxxxnZxxxxxxxxxxvvxxxvvvvtvxcnxxxxyyyuyyyxxcccccccccccxxxxxxxxxxxxxcccxxxvvvvxcccccccccxvxxxvtyyyttuuuy32CdoDD;V;8ZwwZuuw>>w8>O%%%OO=ey^)ae<22wyyuyyuiyV&yyuwVyyyyyyyuw>>&&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%<f<_^SfSssSphJESsPISsIPg_)2oOO%%%%%%%%%%%%%%%%%%%%%%%%%%O;-OwDF6A^F%,UywFFDL^YoSs+LhECFL=DF&unwtwD>O;%%%%%%%%%%&%%%%%%%%%%%%%%%%--%OO4Ye4e3w,%%-OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&OO%OO>OOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOO%>&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%o+o@+o42YUf+fS.5/]LSEYSLKEY@=,y>%U3oe@O=OeV%%w>%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&;)]2oo4OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooOOOOOOOOooOOoo=oOOOO%%%%%%%%%OooOy3Ayuiiyyyytutyvtttvxvtttttvxxcxxxvttttxxxxxxxxvtttvvttttvxxxxxxxxxxyyyyyyxxcccccccccccxxxxxxxxxxxxcccnxxxxvvxxcccccccccxxxxxxvxxxyyyuu3F3=2e2ey86y8>y6wuwwwww>OOOOOOO=oLYo=d4=yu>>VVu>wwVVw>V,yynAV,%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%o5o4fY2CS54JLKYJfShK)_R5LLoo*%%%%%%%%%%%%%%%%%%%%%%%%%%%O%%%>yy6>V>%%FVwy>eUOLCC55Lf^LTD=FFyytwxwAyiy&&%%%%%%%%%%%%%%%%%%%%%%%%%%%%O%eESo4e&O%--OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OO%&%O%OOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOO%%OO%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%O==oo@+oo4SL4SS4ddo2SKSJ5SS@e=iu=V=Se4e@3=&VuOO6%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%)L.o+=oOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooOOOOOOOOOo==O@=oOOOOO%%%%OOOOOOO3Lwuy>w,yyyytuuuvttttttrttttttvvxxxxvttrxxxxxxxxttttttttttvxxvttxxxxxxyyinxxxxcxxxxxxxxxxxxxxxxxxxxxxnnnxxxxxxxxxxxxxxxxxxxxxxxvxxxyyyyuVOCdUd42u>yy;>wyuyuwww6;>%OO%%OOo=daef@F,VVuuwuVwVUU>uD>ywyFV&O%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%2foJL.f@5$SSgLffK2$SYKS@o4oO&%%%%%%%%%%%%%%%%%%%%%%%%%%%%O%-;%->&OO;O,y>>O3Cfdaf5shSUFYLCdwwuuwtuwVDi%%O%%%%%%%%%%%%%%%%%%%%%%%%%%%%o3UFd5=OOO%-OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OO%OOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOO%&%%&&%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%Oo====oO=ooa2DLo>oO+oo4h#hD42OwV=odY2)^2LTDLu>8--%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%OOO%2.2<ooo*OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooOOOOOOOOOoooO++oOOOOOO%%OOOOooO@>C3wuudyuyyytuuuttttttttttttttttxvttvxxvvxxxxxxxxvttxxxtxxxvttrrvvxxxxyyVVnnxxxxxxxxxxxxxxxxxxxxxxxxxnnnxxxxxxxxxxxxxxxxxxvvxxxvxxyyyyyuy3ee[L+d8ty>ZFwDutuuuyyww&O%%%OOd=S=LEfoFAy,yVyyyyD_Aw>yyuyxw%O&%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%@Y^+ELfSfSKgfSLY5SSDSoo5o=O%-%--%%%%%%%%%%%%%%%%%%%%%%%%-%%;-O%;,O&>%Ow>ee4o^J4S4SLYd5CSDduyuutwy,uAu%%O%%%%%%%%%%%%%%%%%%%%%%%%%%&&o+SCS=oO&%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%OOOOOO*O%OOw&OOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOO%OO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%;OOOOOo=oe@oOoO=O%=o=+@fELoSF3duadaF2^Y2odwV%>n8>-%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%.S.@o=oOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooOOOOOOOOOOoo=3=oooOOOOOOOO%OOo@=V3VywyyywwuuuutytrrttvtttttttttttrwwrtvvtvvxxxxxxxxxxxxxxxxvvvxxtttyyyyyVinxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvtttvvttyyyyyyyuuF%d_EF=yu>-DUVDwwwwtVZV6-OOOOOOo3dD3)S5DFywyiuwyV>UwV,yyyy>%O%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%of)oSE44Y)YSKsU4@dSYO@=o%&%%-%--%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%O%O>O>ywd32LE4$42SJSDCdCFUUVtVtyyw,yw%%%%%%%%%%%%%%%%%%%%%%%%%%O%%=o4LT2o<OO;-%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%OOO>o3o=U3OOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%&O;OO&O*OOOoeoOo&O%ooo..S`JEY<CDSL+f4a5o4=3Fw%>;6>;-%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%+sS2@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooOOOOOOOOO=+=ed=OoooOOOOOOOOO@eSUUeLV,w&>>wwwwuyyrwwrttttttttttttvtrrtttttttvxxxxxvtvxxxvxxxxxZZZtttyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvvvvxxxxxxxxxtttttttttttyyyyuy>eC>d^dw-ww8nVyuuw>6utu6>-%%OO%3e^D3Od4wVAVViyVuF,>DUD>;w8%O%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%@odT+oS@2fLpLKKLfd@D=Oo=%O%%-%--%%%%%%%%%%%%%%%%%%%%%%%%O%%OO%%OO&%O>O;de3=fhWISL^]ffLY3dFUDyyVuuyy>yi%O%%%%%%%%%%%%%%%%%%%%%%%%%OO=OdY)T2@oo%O%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%OOO=o=o@LOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOO%%O%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OO-OO&%O>O%>OOwO>O&&ood+.SLEd^{d4Ls54fLa4<d3>yV;ww>&%OO%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOO%%o5[CoO=%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooOOOOOOOOo@OO33OoooooOOOOOOoo@dLEFdDyuuwu>>>8wwyyww8wwwwwwwutttttytttxxyutttyyyxxyyttyyytyyyxxnVVtttyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxyyyyxyytttttyyyyyyyytttttyttyyyyyyyy,udu==YE>wuy;;y>uuw>>ww8uw88>&%%O=TCOdUeww>wFDVuy>,U^F;&O%%%%%%%%O%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%@<=S2=fYS@f5LS5)E5d^doOOOO-%-%-%%%%%%%%%%%%%%%%%%%%%%%%%O%%%O%%O%>%O&%&dC32fLY`_Tf4=UCFVVyuw>uywuwAVuy&O%%%%%%%%%%%%%%%%%%%%%%%%%OO=o3SE]CoO=&O&%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%OOOOooo@=oOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%-%%%%%%%%%O%O&OO%-OOwooo+oo@SYDeSs5.ffSYY+4eu>>wwww>%OO%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOO%%%OOO%&ooL@3&O>%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooOOOOOOOOo=OoOOo+ooooOOOOoO%Ooo2edDD>u>,>>>>>>wuyw8888w868wwtttttwwwynxt8ttttyyxxxyyyxxyyttyyyttttvyyyyyyuuyyyxxxxxxxxxxxxxxxxxxxxxxyyyytyyttttttyyyyyyyyttttyyytyyyyyyyyyi;F>UDUyF%>DAt>>8wwyVZVtwwuw>%O=OeEoddfwyuwuuwuuV;w%OO%;%%--OO%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%1o<3F4@f4Ef2KLK$L4hY+o=o&O>O%%-%%%%%%%%%%%%%%%%%%%%%%%%%%%--%O%-%O%%%%>y=3fPLJ`p<S4233w&>,ww>3uuV>DDww,%%%%%%%%%%%%%%%%%%%%%%%%%OOO>o@3L]S2=3y&&%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%OOOo+Oddo=OOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%O%%%%OOOoo@oo=ee=__`Y25@SfC3d3Oy>>uw&OOO%&%%%%%%%OOOOOOOOOOOO%%%OO>OO&O&OO%>OOwO&OOOOOOOOOOOOOOO%+o^eOuO&%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOoooo&wAV;>w&yuww86>666666888w6t86uwtttuwutttyD6nw8ZtZ6untxAwunx8nVDyvA8yV>VAuTAuuxwttwtut8%wVtxxtxVyxttttttutxZAnuwxtttyyyxxxxytttttyyyytuuuywuVFw&G6>uZAywww6>6wwwwV8;wu,&%&O>d4Td=VDFwww>,;&%%%%%O%%%%%%OO%O%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%*=oe3oLYoffSL4sSsSPP.2.@oOOOOO%%%%%%%%%%%%%%%%%%%%-%%%%%-%%-%OO%%%%%%%>3e3S^_[[hEEYf3e,&wuwyu>uyuuVAVuAu%%%%%%%%%%%%%%%%%%%%%%%%OOOOoo3C^D323dd*%&>OOO;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%OOOO=@4oeoOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOoOoo@3=OUT)ETELY5fe=ey&>;&O%>>%%&%%%%OOOOOOOOOOOOOOOOOOOO&OO&O%O%%OO%OO&OOOOOOOOOOOOOOO%o@3OOOVw%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOooooUV>,wwwwwww6>>>>66666666w-yZ6yFwttuwutttFDwF8ZwytVAwtUTwnyxVV%yAwnyDDVydeD,yVxwZVwtxZy%>88yntutwyttttyttttnVxttVxytttyxnVnxyxxxxtyyuyAVuywy%&wu/Dy-;ww>;>>688wwuAt8wuw>>O3*dDT@3w,>wyu>&&%%O%%%O%%%%%%OO%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%oOO=e=<S4CfK4fgSjKIs5.5.oooOOOOO%%%%%%%%%%%%%%%%O%%%%%%%-%%%%O%%%%%%%%&>yedY))[`foCD=&uy>wwww3u3AyyyywV%%%%%%%%%%%%%%%%%%%%%%%%%%OO%Oo=eC33e=>FL3%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOoo2^T5ooOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOoOOoOOOooo4<dS4ffdLUe&>wdw&%>%OO%%%%OOO%OOOOOOOOO%%%OOO%%OOO%O%%&OO3=OOOOOOOOOOOOOOOOO%%oYC%=y)y%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOoooCuO%>&%>>>>>>>>>>>>>>>>>%>>u>wFwuwwwwwwwZwywVyuyuwuwwFD>uyyuxuDUuxuVAUCFCC>uu66xuyVwyV;%--wyyxVyyuuuyyytyyyytuyVyyuuwuyynyyyyyyuynywyFAwF&wwT^y%TF6>wyuu>www>>wuZt668>>>>VwCdd3LUuO&;%OO%%OO%%%%%%%%%OOOOOOOOOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%OOOLUoeDfSL)EYg!IP'`..+ooooOOOO%%%%%%%%%%%%%%%%%%%%%%%%;%%%%%%-%%%%%%%%=e=fYoS)4@d2Ow;u>wuwwye3ywuuyuA>%%%%%%%%%%%%%%%%%%%%%%%%%O%*OOO>=O=w%OdUDwO%%%&%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%OOOOOOOoL4oo=OOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOO%%OOOOO=o&oo=ofSodTdOdy,>%%%O>A%%%%OOO%OOOOOOOOO%%%OO%&=OO=&OO&w%O=o=O&%OOOOOOOOOOOOO%&Ow3OO%D>%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOooOey>>&&w;;;;;;>>>>>>>>>>VTy>n>wwtwwwwwwwu-uuAwyyV8uVu>wyVVyyFADAxVu>3TFDydVAVVAAyVZuuy6u%O%>wtywuuutyyytVytuuuyyuuuuuuwwytutyyuwyyuwyZn6AVA;wZ>yVywww88wwutw>>wwr6;;;->>%Uw%=oO^UwOOOO&&%%%%%%%%O%%%%O%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%&OOOUT=2DCoS__PI!PK)^..oooOOOOOO%%%%%%%%%%%%%%%%-%%%-%%%-%%%%%%%%%%%%%%%we>CEoS`SSL=&V-688twweeeuyAVy>y%%%%%%%%%%%%%%%%%%%%%%%%%OOO%%%%&V>O&&%>uA>OOOO%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOoooo+oOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOO%&%OO%%OO&OOOod_DdeeC=O>>&&%OwD%%%OOOO%OOOOOOOOO%%%OOO%@o2e=+OOTLOC+33@%%%OOOOOOO%OO%%&eoyOO>%O%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooOOOOOO%%%%OOOOOO>du&>>&>&&&>>>>>;>>>>>>>yTt;V6wyyuwuuwwuyD>UyVwy6yVu>wyux>wDUVywyVAVwUeFAdFFAVxuV>8unw-ywwnVwwwwwuuttuuuyytutytuuuwwuyyxyytyyyyuyuwuyuww8u6ww>;-%;8ww>>66wuw6ww68666>>>,>;&3ooeeu%O&O%;%%%OOOOOO%%%%%O%%ww,;%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%OOO%ud3+oUELh52Qshss@@=oOOOOOOOO%%%%%%%%%%%%%%%%%%%%%O%--%%--%%%%%%%%%%%>wyLEoodf+LUu8wxr;w,3e2awuAViwV&%%%%%%%%%%%%%%%%%%%%%%%%%OO%%--;Au%O&>%O&&>,%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOo=O3o+oOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOO%O%%%%%%%%%%%;&o3of]^eS3ddy3==OO=OOOOOOOOOOOOOOOO%%%%%OOOoodf3=@o4So^ESFo%%%%OOOO%%%%O%%&DOO>>OO>%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooOOOOO%%%%%%OOOOO>=&>w%O&&&;>>>>>;;>>>>>>%8->w>ywtw>ww>>wwD6Uyuuw6uw;>yu;w8uVFuywtuFDyV>L/FCVVw>wwuu>nDy;6VDDy6uywwuuuwwuwuuutyyuyuwwwyAFuuuuuuuuywwyywwyuy>tw-ytuw88wwww;8w>>ww6rw866>>>&>>&&=oo%%;&OOOOOOOOOOO%-%%O%%%%&&&%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%OO&O=C32FT5+2h@fsES2oO%O%%%%%OO%%%%%%%%%%%%%%%%-%%%%O%8>%%--%%%%%%%---%t-&yC+=@+oeDd>6xt6nwwe3dywuyAFUu%%%%%%%%%%%%%%%%%%%%%%%%&%%%%---6t8--;->%,Vi>&&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooo=oooooOoOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOO%%%%%%%%%;%%O%OoO@=^Yoed233&O=&OOOOOOOOOOOOOOOOOO%O%&>>&%e4DC+=+oUT25@o<@%%%%OOOO%%%%O%%&3=&&O;wO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooOOOO%%%%%%%%OOOOOO3iw&>w&&>>>>>>;;;>>>>>wwuyu>w,u>;,,;;,>wwuy&ywVuwuyu>wyAV>,>y>u6yVVVuDTACuAVZDwFDwVUDw&>iV,>wwwwuuwwww>wwwwuuuuuwwuyVAwuuuwwuyuwuuuwwuuw;wwww%uw>->86>>uyw>wwwtr6>;>>>u%AyOO&oO%OOO%&>O%%%%%&>w>%O%%%OOOOOOOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%>%O&%3SC22<+.EYpfL`h+OO&%%%%%%%%%%%%%%%%%%%%%%%%%%--%O>n8-%%%%%%%%%%--%%6>nDu>=oo<oOwtr;rvDuwAedFVyyAAD%%%%%%%%%%%%%%%%%%%%%%%%%%%%%---%%886u>%>&&wu&OO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooOOOo>%oOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOoOOOOO%%%%%%%%%%%%%%%%O=oooFdo==%=OOOOO&OOOOOOOOOOOOOOOOOO%>wuw,JSUfo@=@5L^d23oo%%%%%OOO%%%%%%%&%OuFwOO-%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooOOOO%%%%%%%%OOOOOO>;O>w%&&>>>>>;;;;>>>>>>uw>Ai>Dyw>wu>>w>,>,&ywu>wwww>>y>>>wV>ywwwwwFDd=>3Fwyuwy,wyuww>AVw>>wyy,,wuuw,,w,ww>>wwwwuyyyyuwuyyywwyVwuu,wuu>w6x6-www>8www886wVZy>6wwxt6;>wwww,Fw&&o3%&OO&%O&%%&;>>wuy8%O%%%O%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%OO*%OOdDdpSgQ^P4sSEoO>O-%%%%%%%%%%%%%%%%%%%%%%%%OO%%OO>Zu>%O%%%%-%%%%%%%>tFU%OO&o@o=O8D;;ZUu>Dd4uuiyVyAO%%%%%%%%%%%%%%%%%%%%%%%%O%%%---%-%%6Ax--;O,Ai&O%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooOOoOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOO+=2==3==o2oO3OO%O%-%%%oOO%%OOO@.PYWR52L^sYh hKjs55IE+.@.. XX X.W_.o+o=<oeYo3O%%%%%%OOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&O&&O&u%wO>%VwO;;;>>;;>>>>66wwty8;tFA8;w8uu6%xxFew3wwwwwu;wwwAy;>e3==TF3wwyw>wwwAV>6nw-yVw>>w6>>>>>68wwwwwww8wwwwuutyyyyyytuuuut6wwwuwwwwwwww8ww88888888;nw>w>>>DZw;;>w8tw>>;%%%%%OO%%->u88uytuty,%O%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%OOO%%%%%-%%>&O>C4oY)KPIpLCTFOO%-%%%%%%%%OOOOOOOOOOOOOOOOOOO%OO%%&%%%%%%%%%%%OOOO==SD%O>%%--%%8ww>3332ff^DedSuO&O%%%%%%%%OOOOOOOOOOOOOOOO%O%;&%%O>oO=Cde@=FDSw**OOOO%%%%%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%OO%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OO*=o=LL4o3@2oeOoOO>&O%%%%oOO%%%%O@h)_IP.L)5#{[ss$XgK$.YP.2YKs# # X_fE^SToF`d==OO;%%%%%OOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&;OwVw>;3OO>>O-;>;;>>6>>8wwwwwVxtw6>6u--6ywVwnyw,wwwww,ww>uywA3oe3eT>>,&>AV>%uF%8V%>x%Axwwwwww>>>>6wwwwww88wwwwwuuuttutuuwwwuuwwwwwww88www6>>888888888yy>uV>>ww6>>6ww>66wyu>%%>>>>>8wuyuuyyyyyy>%O%%O%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%OOO%%%%%%%%%%OO2CfYYph#REE)L>%O%%%%%%%%%OOOOOOOOOOOOOOOOOO%%OOO%%%O%%%%%%%%%OOOOoDFOO&%>O%%%%>w>&yFF4oS_EV33%O&O%%%%%%%%OOOOOOOOOOOOOOOO&OO3wOO=OO33U)Y3&Cy%%OOOOOO%%%%%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%OOOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOodEYSYDfSoo@@O&OO%>%O6OOO%--%OC]RKsL4^RfRW`^#sIsSW)Y]]^{[))$$hE)Y^Lff4^{U+&O&O%%%%%OOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&&O>u>wFwwy>Ow-;;;;>>8>6www666>uw>-68;V6;w>w-uuw>www>>>u>&iu&DV=e&L/&w&,OFFwwFnwwwwyxuZyww86ww>>>>68wwwww88wwwwwwwuuuuwwwwwwwwwwwww8>>68w8>>>666688888w>wy>>V;>>68w8>>wwwww88wuuwwuyyxyyyyyuuyu>%O%%O%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%OOO%%%%%-%%%%OooDL.hPL##Ldfoo%>;%%%%%%%OOOOOOOOOOOOOOOOO%%%%OOO%OOO%%%%O%%%%OOOO=YU=&>%OO%%%%;>;,%oCTSS5TyOOOO&O%%%%%%%%OOOOOOOOOOOOO%%%%&&;wOO&OO3%ODAL`=od=OwOOOO%%%%%OOOOOOOOOOOOOOOO%%%%%%%%OOO%%%%%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%O>&o=deL`{`YTdoOoo*=OO%OOOOO%--%OoSYs$ESL5)'.#)WXKI]]g]``]EPfK^Y)E5RY^@f=DLF=O>w%%%%%%OOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%O%%O%&O%OOy%Ow>--;;;>>8>8www668%8w6>w>%Fy--%w-w868w8>>www>>Vi&u&wwoww=OVU&yw,,iw>w>%wywuw6>>>>w>>>>>68w88888wwwwwwwwwwwwww8888w688w86>>8www866w>6666888>wtnw>yuyyuw68uyuw6>>wwtuuuuuyyyyyyyuutyw;OO%OO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%OOO%%%%%%%%%%&OoL^.4sgYPY32&3%OO%%%%%OOOOOOOOOOOOOOOOOOOOOO%OO%%%%O%%%%%%%%%OOOOSDdOOO%O%%%%%----uyVDFC+e%O&OOO%%%%%%%%%OOOOOOOOOOOOO%%%%VuO%&OO,OO==u=VS33%=%OOOOO%%%%%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOO3=o=ddYY2dC2ooOO=*>3O%@%O%%%%OSPYgshLE4+2@ #IEIRK'PE@+DLSS2s4sShY[^4o++o=o>>O>%%%%%OOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%O%&ODTu%>,OO-;;;;>>68www8wwuVyw6>>>w66>>>Aw>66rt8>wyw;wwwdw&>eLC=Oe&yU%w&>>>-Fn>nw%ywww6>>>>>>>>>>66>>6888ww68wwwwww>6666666>>>666668www6>68>>>66888>y%>A>Owtyuw6uVF>wuutuw8uuuuuuyyynVxyyyn>&OO%OO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%OOO%%%%%%%%OO%OoeL25SEKSaoO&3OO>%%%%OOOOOOOOOOOOOOOOOOOOOOOOOO%&>&%%%%%%%%%%OOO%dd>OFwO&%%%%%---%%%=3F2oOO%>%OO%%%%%%%%%%%%%%%%%%%%%%%%%-ZtO%;%%%&O%VAF>d==OFV&%OOO%%%%%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%O>OOOoo2o@SY5dC2=2oo&U^De=&%%%%;2E[IPE5SS+@s2XLW`KsLEh<o4=EoL)ULP]^YsssfSdd>O;OO%%%%%%OOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%u3%&O>y%;;>>;;>>www86wwtVw>,,;>y%>>>>Fu&69tvr6wn>&yw&yy>deVeTUO3OuOuuu>wu;DUwyD>www88w>;>>>>>>>>>>>68888688www88>>668866>>>>688w>>6>>>>>>>>>6688w>>8>AD%wwuw6wyZwwuwutyuyyyyyyyytyyyyyyy;%OO%OO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%OOO%%%%%%%%OOOOOoJ2@SL44Fe3O>%&&%OOOOOOOOOOOOOOOOOOOOOOOOOOOO%&;>;%%%%%%%%%OOO*=wCTUL3=O%%%%%%-%%%ADddO=%OOO%%O%%%%%%%%%%%%%%%%%%%%%%%--;6-%-%O>O>OO&ODu3o3oOeeOOOO%%%%%OOOOOOOOOOOOOOOO%%%%%%%%&&%%%OOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%>>%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOw=OO%ooSCf<O=o=3oU`TO=>&%%;ud^Ygs5SS@+SSRKP)LPE2f+hffT3dJEESSE`WSPE^Ede&=OOw%%%%%OOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OO%OOOO&>%u%O>;>>>;;>>68ww8www>&&ww>>w>w>&%y>>99rrr68u>&w3ed3wSF>=)^3dw3>yu>%&%%uxwwyw>>>>wuw>>>>>>>>>>>>68886688ww866>>6www8666>>>668>>>>>>>>>>>>6688y>VV%D^Vwuuw>>6wuuw>>uxVyyyyyyyyuyyuutw>&%OO%OO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%OOO%%%%%%%%%%OOO+LC5DLSo>*%&VywOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%&>&%%%%%%%%%OO%&=CdTUdo=o%%%%%%%%6%wV>OOO&&OO%%O%%%%%%%%%%%%%%%%%%%%%%----%%%-%%-%-O%>%w&=oOOUFO>OOO%%%%%OOOOOOOOOOOOOOOO%%%%%%%%&%%%%%%OOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OO&ww&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%O>%OOOO=@eoS^Ye=<oeCDCoO=>>-->VS^pf$$sJDfPgL`^fY`S452ho53>e=e=JeSUsoEEDheu33%>O%%%%%OOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OO&%O;%wD&%;;>>>>>;;;>>6www866w>>>>>>;>>>>%3%>9769w6;>>>&>DFO2Oe33==yOy>w>&>>>ww;->>>w>>;>wVVy>>>>>>>>>>>6886688www866>>8wwww8ww86>>>>>686>>>>>>>>>688>w>ut;ATwuuw>>6w->wwwyyuttttuuuuyyyyyyw>%OOO%OO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%OOO%%%%%%OO%%OO%O=^de^Y@>%O>AyFDOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%&&%%%%%%%%%OOO%=>yweeU2oOO%%%%%%%--;-%OuOO&&%%%O%%%%%%%%%%%%%%%%%%%%%%---%-;-%;;%%%O;Ow>uo3^S&3C%OOO%%%%%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OO;uu>OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOoo@4CFd2eCTE=o&Oo3>F%DFDCEs#s#T)f2^_KoEfDfL442=feO3>w=e3+dL^2])sd=Vy>8--;%%O>OO>%&%O%OO&%%%OO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%>w3&O&,%-;>>>>>;>u8>uwuud>wdOOyyO33>>%>r9-x6%Z%uOwdDD32eoeeO33&w,;&>w,>>>>68>>>>>>>>>88>>>>>>>>>>>>>>>>88888888>>>>8www8666666666666666>>>>>688u8>wwwtVww>>6ww668wwuuuuuuuwwwuuyytwtyw%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%OOOOOOeDDe@oOOyVFedwOO=@oO@oOOOOOOOOOOOOOOOOOOOOOOO%OO%%%%%%OO%%%%;>CLeL^EooO&%%-%%-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%;%-%%%%%%-%%%O6%uVC/AFeu3y%%OOOOO%OOOOOOOO%OO&OO%O%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%O%%%%OOOO%%OOOOOOOO%OO%%OO%OOOOOOOOOOOOOOOOOOOOOOOO%%OOO%%O%OOOOOO%OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OO+OoO==+o3dDU=%=OoCyyw^T3SEP$X5shs({f2Td2f2dSif3LEe=CdediF=fYSLLhA>w>>twu%%6&O%>oOOO%%%%O%%OOOO%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%;>&>,ww8>;;>6w8>wwyVw;=DVOO>3&3yA>3w>O%x8%8>-w>e=dYUee3D3Vww=uV>&uw%O>>>;;-;;>>>>>>>66>>>>>>>>>>>>>>>>66666666>>>6688w6666>>>>66666666>>>>>688ntwututyw8668w86wwwwuuuuwuuwwwwuuuuwww>%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%OOOOOO&ee&oO&OA3w=3eC=oOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%O%%%%%OO%%%%&>wDCdd^.+&OOO-%%;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%--%%%%6>%%---%%%O>>>y;iVCdODdyw3%%OOOOO%OOOOOOOO%OOOOO%O%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%O%&&&%OOOOOOOOOOOOOOOOOOOO%%OOOOOOOOOOOOOOOOOOOOOOOOOO%%%OOO%OOOOOO%OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOoooOO%=ed&&OOo3wuwDFO55ss#fLY$^^fHf<o4<iCef2SA>eUVyyAA3eFJ4fSTAywwnxty-%;OwOO&O%&O%>%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%>3wwww>;;>8wuuVw8twy=Fd3w33>dLF%&>wO66nyyu&,>ODTDESdOD/LOVO3iVdw>>;%--%-;8uy>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>66666>>>>>>>>66666666>>>>>688nuwuytuw>8ww8688wwwwwwwwwwwwwwuuuwwuw>%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%OOOOO%OO%%OO%OOVCdFo2Yeo+=OOOOOOOOOOOOOOOOOOOOOOOOOO%%%OO%%%%OO%%%%%&3Od^fL+.oO&%%--%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OO%%OOOO%%%%%%%O>OO%V&3uoVw=ODFw%%OOOOO%OOOOOOOOOOOOO>u3%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOO%;>;&%OOOOOOOOOOOOOO&&OO%%OOOOOOOOOOOOOOOOOOOOOOOOOOOO&%O%>%OOOOOO%OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOO%OO%&O%O%%%OOoOwVt>wC4fSfXL^EEShSSLTL3eS3333<33*13VVy&VySFaCFTDVynZxrn>-O%OooO%%%OOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OOO&>>>>>>>>>>>tyAy>uyA3w&3e%=3CFwd%=w=u>w>=yV3=LLU3SYLe33>>3VVwAA>%,w%---;>wyn;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>866>>>>>>>>>>>>>66666666>>>>>688uw6wyyuw>8ww>>8wwwwww8>>wwwwwuuyuutyw-%-OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOO%%%%%%%%%OOF_fY4=U4o%&OO%OOOOOOOOOOOOOOOOOOOOOOO%%%O%%-%%OO%%%%%%%o3D@SL@=o=&O%O%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&O%&>>O%%-%OO%%O%O,UTwOOOF>ODEy3%%OOOOO%OOOOOOOOOO%OO,yw%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOO%&>&%OOOOOOOOOOOOOO%3w%O%%OOOOOOOOOOOOOOOOOOOOOOOOO&OO%%O>d%OOOOOO%OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OO%%%OOO%&OO&%O%OO;wxyVCCEKs$fLYL+fSdUD3,eA=33e23Sdouu>>:uwDy14eZy>6txxnZZTA%OdOO&%O>%OOOO%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%OOOO%%>>>>>>>>wwVVVAyyDLCeeCCe===T3e3OODeO333oCY)Eof4oODA=ywOO>>>,;%%>>>;;;;>>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>866>>>>>>>>>>>>>66666666>>>>>688ww8wynyw6ww>>>wuwwwwww6>wwuuuuyyyuyy8%%;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOO%%O%%%%-%O3oC]oeD33ooOOO%%OOOOOOOOOOOOOOOOOOOOOOO%O%%%%%%%OO%%%%OOO>=o4)LYU@oO%%O>%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOO&O%%wy%>%%%%%%%OOuDTUOO&Od3&CD%3%%OOOOO%OOOOOOOOO%&OO%;O%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%O%%OOO%%OOOOO%OOOOOOOOOO%3w%O%%OOOOOOOOOOOOOOOOOOOOOOOOO&OO%%O>d%OOOOOO%OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOO%%%%%O%OO%oOO-tuweE_Ysgh.TSE+diOyy,w>y=32d@SD1V%Oq6>uV1*w1nn;>w6vZwVTyyO&o%%OO&&O%OO%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%OOOO%tuw>>>8wwwVyyZyVdCe34ddO=3eE3de=4d=fa2UET[Tede4SFVe=y^CV&&&;>>>>;;;;---->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>66>>>>>>>>>>>66666666666>>>>>688888wuyu>686>>6wwuuuuuuwwwwutttyytttw;OO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOO%%%O%%O%%%%Oo=TdoCfoo=&O%-%OOOOOOOOOOOOOOOOOOOOOOO%O%%%%OO%%OOO%%%OO&oJQ)pKJsf=o=%O%%%%%%%%--%%%%%%%%%%%%%%OOOOOO%%O&ywyyO%OO%&&OOO>FF>Oo=>o>CFOO=>%%OOOOO%OOOOOOOOOO&%O%%O%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%O%%%OOOOOOOOO%OOOOOOOOOOO&&OOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOO&%O%>%OOOOOO%OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%-;%O&O%O%OO%OwxtwS){SPK.Y4SE4eeeO>,,%e===ia3Oo1wqu>wx:>uu1AFwwt;wvxFD>Uyo3&O>wOO&OO%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%w8>>>8ww8wyw>uyAde3Cd33=3edS=edTS+S^L@e3@f+oo3=CD33^DydV>w>&>yu%-;;>>>>6>>>66>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>688w66666666>>>>>688>886www>>>>8www8uuuuuuuuwwutuutytyu>%O%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOO%%%-%%%%%%-o=o4Ts5d@@==OO%%OOOOOOOOOOOOOOOOOOOOOOO%O%%%%%->%%OO%%%%O&oDsRS.$gEFo=&O%%%%%%%%---%%%%%%%%%%%%%OOOOOOOOOCYDAC*d>%O%%O%3=deo=%2o3o>TL%&O%%OOOOO%OOOOOOOOOOO%O%&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%O%%%%OOOOOOOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%OOO%OOOOOO%OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%--%%OO%O;O&O;Oo=O-yDFL)E$K#s^U`S@Ded>i>,u&3+e3++=eowu:rtq6uV%y8V>8v6rvrZA%yFd>wuT^y>A>%%%&&%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OO%%%%OO%->ww6>w;8>wVuwSd4e2@34@=e3e4S`C@+2.oo@o@o+=o2==Od33wOud&Owy,&>>>>;;>>>>>>86>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>68www66666666>>>>>688>wwwwuuw>>>wuu8>wwwwwwwwwwuuuuuuyxt;O%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOO%%%%O%--%%%@o@=h5@.@ooOO%--OOOOOOOOOOOOOOOOOOOOOOO%O%%%%-wx&%OO%%%%&o<o.EPhpsEU=oOw%%%%%%%%----%%%%%%%%%%%%OOOOOOOOODTCwdyTA>OOOOwFO&Oo=oOoo=o=>O3O%%OOOOO%OOOOOOOO%OO%OOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%O%%%%OO%%OOOOOOOOOO&OO%%OOOOOOOOOOOOOOOOOOOOOOOOOOO%%OOO%%O%OOOOOO%OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO6%8%wd4fYLgYXg))Au6tVyww>>>>6www:->wyuq>>::>wuw>uw,uyu>*VVVVyuuuy>ADiFJy,y3O%&OO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%&;>3w3>>www>e%3d)Ldd33D&ddD^3>&%OOO%O%%OOO;wwwwyAAy>%ww%%Du&>&&,8;&>&&;;;;;&>;ww;;>>>>>>>6>;>>>>>,>>>>>>>>>>>>>68wwwwww8866>86>6686>wwwwwwwwyuw8wwwwww8wuytuwuuuwwuyyw&OO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%OO%%%OOO%%OO%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%OO%%O%VUw&O==OoOOo=Oe{U4eC3dVTO;%%%%--------------------oeoO2=oCdDU33eede&==O>yuOOOOOOOO%%O%%%%%%%%OOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%>eDS2`RPKK`'PDVuyVyuuwwwwtyytw>-:>>>qwq>6wwwquyywu::>wwwwwwww>Owy:uV:uFUD,O%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%&&>;;>wyyyu>%>=Ud3=%eTLDeoo;&%OOOO%O%%OOO&>wwwuVAAAV%&%u&%&&>>%%%&>;;;;;;;;>;-->>;;>>>;;;>>>>>>>,>>>>>>>>>>>>>>6888wwwwwwww66668888wwwwwwwwuw6>8wwwuuwutyytuuuuwuuyuw&OO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%OOO%%OOOOOO%%%%O%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%O%&OO&uyu&yLF====OooT/233dwyUwO%%%%%---%%%--%%%%%%%%%%%=oo=ooT)CSUdde33Ddy3OO*OOOOOOOOO%%O%%%%%%%%OOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%6%O%e4Y[LIs[{ sDVutytuuyyuutuw6yw::>>>quuwqqqwwuADui>>w>>>>ww,>w1wu1uywVyDF%O;O%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OOOOO%%>>3uyuw>O%&o3%OoOOdw==O=%OOOOOO%O%%OOO%&wwwwwuyVw&wuV%>%O>w,,ww>,>>;;;;>>8-;yy;;>>>w>-;w>>>>>,>>>>>>>>>>>>>>>>>>wwwwwwww668w888wwwwwwwwww>>>6wwwwwuwwwwwuuwuuuuu,;%O%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%OOOO%%%%%%%%%%%O%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%OO%%OO%wwVu3DDoOO=3ooU]E=d=>Fu%-%%%%%-%%%%--%%%%%%%%%%%OO3oS^]Ue3d3e3ede>>=O%=%OOOOOOOO%%O%%%%%%%%OOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%--%C45`_L^_]RShFVuuytttyyyuww66uq>qqq>6wwwq66qq>VF>V>>:wwwwww>>qwwqwwwuV**>%&>O%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OOOOOO%>>>,,>%OOOOooOOoOoOOoOO&OOOOOOOOO%%%OOO%>>>>%OO%Ow%uOO>w>>;;,8>&8,>;;;>>-w>8AV;>>;wny>-w>>>>>,>>>>>>>>>>>>>>>>>>wwwwwww868ww866888888888>>>>8wuuwuuww>8wwwwwuuuw&%%O%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%OOOO%%%yu>%OO%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%OOO%%%&wOwV=eT^O=o=3ee^_242ODF%&%%%%%%%%%%--%%%%%%%%%%%O>&C]DO*e=w3eeFD>&%OOOOOOOOOOOOO%%O%%%%%%%%OOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%,UCU^2+EE+@]LAVyyyyttwwuwwwyV>::qq6>>>>qq6>>6>yV>Vyu>uwwww,>:>wqquwqyiiyyVw&&%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%OO%%&&%OOOO*OO*OOOOwO=OOOO%%%%OOO%%%OOOOO%%%%%OOOuVTUy%%UV&%;;;>8,>;;;>>%w>>nu%>>;wny>-w>>>>>,>>>>>>>>>>66>>>>>>6666666688ww86>>wwwwwwww6>>>wwuuuyyuw8wwwwwwuuw,%%O%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%OOO%%%yu>%OO%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%OOOOO%%w&>y3F_e>o3O=DLL3af=/YO&%%%%%%%%%%%%%%%%%%%%%%%&O%;3&AuuwVuuwFV>;%O%OOOOOOOOOOO%%O%%%%%%%%OOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%;%&VD[LdfD+2fY4Vxyytuw66ww6>>uy6>:>6>qu::>6qq>>uuuuuViuwuuuww>>qwuuyuuNyAVyVu%;%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%OOOO%%%%OOO&OOOO%OOOO=*&%%%%%%OO%%%OOOOO%OOO%%%%,&&&y&>OTV;>w,;8,,>>;;>>;w;%>>;w>>>w>-;w>>>>>,>>>>>>>>>>6666666688888www888ww8>;uuuuuuuuw86wwuuuuuuww666,,wwww>;OO%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%OOO%%%%%%%%%%O%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%OO%%OOO%Oy>O>w>e]Ueo&O3eSSdL4EDO*%O%%%%%%%%%%%%%%%%%%%%%>w>uy>>&>wy>>wDyO%OO&&%&OOOOOOOO%%O%%%%%%%%OOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%;%%>U{ToL33S=Seyytuww6>www6>>>>wq6q6>qw>>>>qwq>wwwA%uw>wuyyw,,w::>q>>quuw>&;w,%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%OO%%%%OOOOOOOO%OOOO&OOOOOO%%%%%%%%%%OOOOOO%%OOOOOO%O>O>uu%u&%>,&%%>>>>>>>>w6>;>>>w>>>;;;>>>>>>>,>>>>>>>>>>>>>,wwww,,,wwwwww>>wuuw>wwwwwwwwwwwwwwwwuwww8>>>wwww,;%%%%%%OOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%OOO%%&OOO%%%%O%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%OO%%%%%%&OOw>>w>LUE3O=oe((fL4F4@OOOO%%%%%%%%%%%%%%%O%%&&O-wyw%wtwwuwwyUZ&>%O%OOOOOOOOOOO%%O%%%%%%%%OOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%O>&3FL2o`/o33=dtttuwuuuuw6wttw>qqqwq:-:uq>>qwwqyiFTwVuw>uyuw:>>q>qw>>wyywxy%wV%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%OO%O%=OOO%OO=OO=OO%OOOOO%%%%%OOO%%%O%%%%OOO&O%w&>OV&>ww>&>,&;>>>>>>>->6>6>%>>>>>6>;>>>>>,>>>>>>>>>>>>,wwwww>>>,,wwww>>wyyw>wwwwwwwwwwwwwww8yuwwww8>wuuu>%OO%%%%OOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%OOO%%&%%OO%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%&%OOO%OOO%&%O&udydVE3O3O]]ff5C4oOOOO%%%%O%%%%%%O%%OOO%&>tx6-n>>;w6uyt6Z%%;OO&&O;%%%%%%%%%%O%%%%%%%%OOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%O>O%O%O>Oy,uD^of^S3o*y%yAy6yw%wwuyuwwwuwwq>>>>>wuuq>>qq:VDFywww>ww>**>wt>:>q>:>wVyu>8y;OOO%%%OO%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOO%>&&>&;&&;>>>;&&>>>>>;>>>>>>>>>>>>>>>>>>>>>,,>>>>>>>>>>>ww,wwu;w>>wwwww>w>y8w>>8w8>86>uwwwwwwwwwwwwwww>ww,&OOO%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%&&&%%>w>VuAwo3Oo)^SL@fd+&OOO%%&%O%OO;>OO>OO>;www86>;>66t6wtwxx-;&%OO%%%%%%%%%%&%OO%OO&OOOwO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>%OOOOOO>C=C3CDaDFOyu%:wwxw;uw-w>6wwwwuuwq6>>>>6uuuw>:>qyyuwuyyu:>,,>>>wtq>q6>::6yuuwwyw&%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%OO&%OO>ww>>:**:>:*>>>>>>:*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,,3wwuwwwy3uuuy&y;Vwu>wuwwwwuuuwwwwwwwwwwwwwwVy>%OO%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%O%&>wy>VC3wO@@)(Yf2<@OO&&OOO%OO&OOOO&%%%,T^&w8868wwww8tytnn;%%O%%%%O%%%%OOOOO,%%wwOO%O%%O&O%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO;O%%O>AFdieDC+SLe*euu>;>u>;uw>t>>>6wwuwqqq66qqq6>quw6qtiiu>:>wu%*>www,>rrq6666>6y6wu6www>%OO%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OOO%%%OO%&&>&O%ww>>>>>:>>>>>>>>>>>>>>>>>>>>>>>>>;>>>>ww>>>>>>>>>>>>,3,>>O33u;uwwwuuyyw>>uyw>wuuuuuwwwwwuuwww6>>Au%OO%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%O%%%3w>uFV33f4.LY_YF=oO;%O%OOOO>%O>w,uO&Vu>w666688ww8wyyuyx6%%%%%%%%%%%%%%%%%>O>O%O>&OO>%>O&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOO%%%%OOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&%OO%OVD+ddTF<eCdCu*Vt-;w>>uwwytwwwuuw6qqwuuuww>:>tyqwNuyyu,>>>**>www,>>qq::qwq6t>wy66wuw&%O%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%OO%%%%%O&www>O>ww>>>>>>:::>>>ww>>>>>>>>>>>>>>>>>>>>>>>w>>>>>>>,3>>>,3>>>;uyw3uwu>y>V>u;wuuw,wuutuuwwwwwwwwww>>-w&OO%%%O%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%-&%%&wy>ee>F)s+45e]]FOO&OO;%&OOOOO>,O_/O3A>>68www6>>wuyuwuu8>;%%%%%%%%%%%%%OOOyT>%%%OO%w;>O%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOO%%%%OOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO;OOOwDOuf4CTUDS<e=Cy>wwx;>>>6w6wyuwwuuw>qwtyxyuwuqwyy6>uuw>wyVu*>>>>,ww,:qq::qwq>w>txwtuuw&%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOO%%%%%%%&OOO&w%&::**%*:>**::>>,w>>>>>>>>>>>>>>>>w,>,>&;,>>>>>>>>3>>>>,>>>uuw%,>>iVwy&u>ywwwwwuyyytuuwwwwwwwww>-%OOOO%%%O%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%-;&%%,d;>>*DJ.)Do@){Ty&>OO-O%%%OOuVu>FDu>uuwwwwwwww88tuwwuuww>-%%%>>>>;%%%%O&%AT%&&OO%iww>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOO%%%%OOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%O&&ATuA52EYfJS23Oe1qrrxwwww6wwwuw6wuuwwwuyyyyuwwqquuq6wuwwwuuu>>>>:>>wuqqq::66>ww6t86t;>>&%%%%O%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOO%>>%%%%>Ou>%>O%******:>::::::::>>>>>>>>>>>>>>>>>&>>>>wyww,,>>>>>>>>>>>>>u>&3ewwuVAFyuww;>3>3uuutuuuuuuuwww8>-%%OO%%OO%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%O%%-%%O&u>3w%V^f)YoSe3Dw%&%%-%O%-%>VAtV%tV>yn%>>>wwwww,yw>yVyuw>%%%;8wwww8wyywwAwOO&O%%>Fwu>&O%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOO%%%%OOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>&yAyw5JT45JS5=3eOqtt0twuuwwwww66wwuuwuuuuwwqq>>>qwwwqwyiw*%:w>>>:*>wyrq>666>>t66w%6Z;&%%%%%%O%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOO&ww&OO%>>UD>>&>**:::::>::::::**>>>>>>>>>>>>>>>>&%&>,>uVwww,>>>>>>>>>>>3w3w3TDVd>uGFD>u,>uyu,>wuuuuuuuttww>;%%%%%%%OOO%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%,wuw>3^LdoCOo&>%O%%%%%---OO;w-uwywuu%%&;>>>,wwwywwVVw;-%%%->>>>8w6uVVy&VwO&wOO%&yuw>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&O%VVD>S[$SSR)h@13Ow:0zuwww>>w>wwwwwuuuuwq>>>>q>qq>>6>:www>>>>**:>:*>uit6:6wq6qt-6t-xUV%OOOO%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOO;uw&OO%&ODFO&>>%*::*%*:%*::>::*>>>>>>>>>>>>>>>>,>>w>&>ywwww>>>>>>33>>333Ow3)F3O>VAF>33VyFDAw>wuuuuuutyyuw;%O%%-OOOO%%%O%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%--%%%%%%%%>uw>w>224d2=e=O&&%%%%;-%%%%wAD>yAuAFuV,,,,,,33wywwAV&OO%%;>>-%%%%O%>;O&O%&OO&%%O%w&>O;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%>uw%O%%%OOOOOOOOOOOOOOOOOOOOOOO3O=eC^e])4of[_C=>>>qqwwuq>>>qq>wqqqqqwwytwq>>6q>>>qwwq>wwww:%*ww:>>>yVwu3:>Ou,,:wO>:wUu:%*1=@@+@=OO=&O%%--%-%6%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%OOOoooo2S=&OV&>-%->;;>;;;---;;>>>>>>>>>>>>>>;;>>>>>688w6>>886>3o>do3w=3eAOOoOO--DDeCL5sfd33>6yxyuuwwwww>%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%OOO%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%>%%%wFA%&,VV3Fw&O&%%;%%;;%--%%D^8wAu>ywuw&&;ww&wiV%wDV%%O>-%;%O-%%;O%-O-OO%%%%%%O&>>>&%%>%Ot8OO>%%%%%---%%%%%%O%%OO--%O%%%%OOO%;%%%%%%%%%%%%%%%%%%%%OO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOO&&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%>uu>&>&&%%%%%%OOOOOOOOOOOOOOOOoo3UF4dD^ffeC_Y3>>>>qqqwwq>>,qq>>>>,qqqwqqqqwwuuuwqqwuuuw,wuuw,ww>>wwuu>yw>w*w>ww,uu*,wO*wyw1ieoei3OOOO%%O%%%OO%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%OOOoooCDdOyuO>%->;-->6;;;;;;;;>>>66>>>>>>>>>;;>>>>>>>>666>>>>>%33=33=S3wCOOOOO;OuDd2fY<DD=Out;xyuuuuww>-%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%OOO%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%wDDwwOuA>DwO&&>%--6%%%%-%%;t8yuu>>u>>uu&>yu&w;AOT^OOO%%-yw%O%%-O>y-%O%%%OOO%%&>,>&&&-->O%8->>;-;>>%O%%->-OO%%%%%%%%%O%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOO%=>>&%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&,>&&>;&&%%%%%OOOOOOOOOOOOOOOO=3^^ULFd_<f=@Cdi111>1qqqwq>>,qq>>>qwwuuwqwwwwwqqwuuuuuuu,>>uuw>>wwwww>%****yuu,w>wTD*>%,:>>=3edFdFC3=*OO%%%;%OO&OO%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%OOOOoo^Lo=3uOw%>>;-;;%;;;;;>>>>>>88>>>>>>>>>;;6>>>>>>>>8w6>;>>=3&OeeOC>3dOOOOO%uu3e2dY4ffe3>8yytuuuwww-%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%OOO%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%O&&O>DDu>3>wdDOwwO;%%%6%---%%;;%wuwuuwuwu>>uwuiyi%u>Vw&>%%O>AA8%%6w%wV>%O%%%OOO%O%&>&%%%O-O>V/>>w>>wyyw--%wy;%-%%%-%O%%%%O%%%%%O%%%%%%%%%%%%%%%%%%O%%%%O%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOO*==%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&%OO%%%%OOOOOOOOOOOOOOOOOOOOOooEU=JS<`CF2=++3111>>qqqw,>>,qq>>qwwuuwwuuuwwq6>>wuyuwqqww,,>>:*>uuuu:*V%>*ww3www%Aw&y&>w%y3OE`YdSFeuw&%%%OOO&OOOOOOOOOO%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%OOOOoo_^=oO3wO>>;-6yu%;;;;;>>>;>>>>>>;>>>>>>>>www86>>>>ww8>-;>eO3S3e3O3wd=oOO=6AyO3a44[^4wCu;yuuuuww>;%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%OOO%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%>>O%yVw&Vw&VACDe&O-%%%-%%%OO%;>&%>&>w%>u&%uw&yV%AwU)OOO-%O;yZyw-yy>>w-%%O%%%%%%O%%&%%OO-O>%/Uy>;-;>w8-%-%yV-%>%%%%OO%-%%%%%OOO%%%%%%%%%%%%%%O%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOO%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%O%%OOOOOOOOOOOOOOOOOOOO%%%OOOOO=o3SeLDT^Se2e=*=111>>>>qq,>>,qq,>>,qqq>>wwqqqwww6wuuq66quuuw>>wu%wwww>uDVFw*>>uww>>**,3wuw>&dEEaCFd13uwweOOOO>OOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OOOOOOOLE=D/>O>;>--wAZw----;;>>>>>>>>>>>>>>>>>>wwww866>6www>;>6O=L^O=uy3uy=O%O>Aw>w32=@dddye&;xuutyu8-%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%OOOO%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%&>;%O%>uu,uw33^D>yO>>x%6OO%-%OO%wVw=>=>>>yw>&>y>y%VuuOwO%O%%>wtu>uw>;%%-%OO%>>&O%%&&%%%%-O-OU--wwwww>-%O%O8t%O;%>;%%%-%O%%%%%O%-%%%%%%%%%%%%%%%%%--%%O%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOO%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OOOOO%%%OOOOOOOO%%%%OOOOOff4)ESCCC@o213w11>>>>>q>>,,,qqq>,qqqq,>uuwqqqqqtuwq>6wuuyyuwuVA*,,:%%wAyDiuFuy3*yyy>OyAV>%uC=o=ed41wwwuCO3o=OoOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo&o^_O%w%>>--6ww-----;;;86>>>>68>>>>>>>>wwwww8668www>>>6e=OCwLwO>>>OO*O&V%>y=O3223=O>uwuttyyu>%O%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%OOOO%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%&%%%O%yVww>3OTe=C>>>Dw%%OO%>&%OdTdewOC=>VuVVwyiDADO%&O>OO;6;>uwwwOO-%%%%OO%>,&O%%%%%%%%OwO;O>O>wutw>--;%O;8%%6>w>;;-%%%%O%--%O%%%%%%%%%----%%%%%%%%%OO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%O%%OOO%%%OOOOOOOO%%%%%OOOoDY4_^S4e33=wu1*>>>>>>1q>>,q,,qqqqwwwwwwuuuwq>>:yuwwwwwwwuyuuyyyw>>*%*ww*ywVUyu>>>O>u>wwyOFDOeUd=33wewwydeLo@oooOOOOOOOOOOO%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&=&ywOiO*>>:%O%*::***:::66888866>>>>>>8wwww866>>6866>>>>Owe>&e&u3&O*Oe*&w;wwO=e2@33eu>;uuuww>&%OO%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOO%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%O&OO&%%wyy>%wOwVDVd>&VA%O%%OOOOO&TLe3eeOyF>AD>yD/yw>O&>O%O>uwuy,yV&O%O&O%OO%&&%O%OOOOOOOOO%O>>%%%%&&%%%%-%%>wwutu>>>;%;yy;O%%%O%%%%%%%%%----%%%%%%%->;%O%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OO%%%O%%OOOOOOOOOOOOOO%%%%%OOOO+=S5h5)L&e&>uw>>>>>>>1q>>qq,,qq>>>,qwwu>,wwuwwqwwuyyuq:>wwwww:Ow:>wwVAu:>OuL*>>>>>>w>*w*y>>Cd3f33113,yDST_44dC2========OOOOOO%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>V>Ow>*%>w>>:>>::::::>>6ww6>>66>>>6ww66>>>>>>6>>>>>>>>eAO3ww>y3*weDewu,>3>====4>O&wwwuw>&%%%O%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%>OO&&O%u%wy*3eT^dCu;%D>OiFwOO&OOS^ddT23VUw;y%uFA%u>O&O>&O&uwyy>VDV>OO&O%%%%OOO%%%%%%%%%&O>%O&O>>>>>,>&%%%%;yyuyw>>w>%wDUV%O%%%-%%%%%%%%%%%%%O%%%O%>uu>O%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%OOOOO=ooS4f)Ad3=>333>>>>>>1q>,,qq,,>>>q,>>wuw:q>wu:Nuuu>quu,**uyD_::wVAy,w,:>>>>>&>3w>3uu>>>>>u*CdO=DY41*Vuuda4a2f24C^@YSLL@oeOOOO>O%&%O%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%&&>>w3>:O>>%>%*>Ow:Oy%;>68866866>>>6www>>8w>>w>>>>>>>>>&>d%>>>,,3wuuw3u>&>33=3>3>=&>wwyAwOO%O%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOO%%%OOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%8,yy%C>TCT^OdVO&%>ww&OO&O3e33de=VO,wuDAw,uD&O%O%;O&ywUAO>wu,&%OO%%OOO%%&&%O%>&&y&>w>%O%;yyuww>>&%->wwwww>>6wwwww;w88%%>%-%%--OO%%%%%%%%%%%%%-----%%%%--%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%OOOOOOo3=D(fC@yu33ww3>>>>>>>1q,,qqqq,,*:,wwqqq:>u>qyqiyyuqqq>**uuiVU>VuVVuwww,**&,w>>,w,wuu,>3wOAuO+4<oe1e*VDDLC5fS@CDC4D4eD5SSdo=OoOOOO%%&%%-OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%O%%%&&==O%%:O%y:OuywOw%>>>686668>>>>>68w8>>ww6>>>>>>>>>>&>yDyyw>wwwwwwwww,,,>>>wFFVuwwww%AFw%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OO%OOO%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%uwyF__E]TV3y>O>%&>;%OOOO&=O%3=OwuwOwT/yVyD&%&O%O%u>yu>%>ww>%OOO%%OOO%%&w&O>Vy>;%&>&%O%&>>>>>;>>>>>wyyu>88wwwww6>8>6;-w;V8%O%%%%%%%%%%%%%%%----%>;-%%%%O%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO+=eDdd22ww3wuuw>11>>>>qq,,qqqq,,wq,qqqq,1>uwqq>ywq1wwwqq>V>yuw>Auuuww,www>>,w3>,w>>w3>&>>>ULe=4oSd33OwJDofC2fSLaCa4EL^F^FY]o@2oO=%OO%&%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%OO>&:wOO>O*OOO>wOO>>68>>>6>>>66666>>>ww8>>>>>>>>>>%&>y&;&>,www3wyVww,>>,w,wuw>>>w,dw&OOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO;%%&%O%>OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%O-O>>DT3_UOde=&%O%%%%OOOOOOOOO%OO&O%OwDyV,yO%&OO;%>%U,%w&wyw>&%%%%OOO%%%>%O>Vy&OO%%%OOO%O%&&%%>w;8uu6>6wwwwwww8>uu>ww>w>Fy-%%%%%%%%%%%%%%%%%%%%%---%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO4deedOTDuw,wwuwww,>:>>qq>>>,,>>>Vyw>>,qwu*>w>%%w>*>wuwwy,y*uy*,uuw>ww>>,Ay3>>>>,,>:>>&&>udFu3===Ce=31>Vuf4d43LfDLY5EYd53SC]Yo2oo=OoOOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%OOO%%Owy>>>:w*UuO:V>>>>>>>>>>6886>>>>>8w8>>>>>>>>>>w>%%O&>w>>>>>wuyw,;&>uw%%&>>,ww>)D&&;&;&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&&%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%>-%u>od=dC3eCeOO%%%%%%%%%OOOOOO*%OOu&O&wwO%OO%O%%OO&/A>O%wdVyw;%%%OOO%%%O%O&>%O%OOOOOOOOO%&%%%&>6wuw>>6wwuuuwwwwut>uyww8uuu8-%%%%%%%%%%%%%%%%%%%>>>-%%%-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooOOOOLT%e=ydOw>>wwuwww,>:>1qq>>>>>>>>Vyw>>>qqw:*:*>u>w>1ww>>q>>>>uww>w>>ww>>>Ayw>>>>,w,>,,>>3O>yyA43=3e13y&wVLSFe2LdfCDfFSCSfLS$Cao+=oo@>OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%OOO%A>*Vw*u%ww_F>O%;>>>;;;>>>686>>>86>>>66>>>>>>>>>w>&&ww,;w>&;>,>&>ww>wuw&,ww,>>>&U3O>OOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%O&yu%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%O%O3%434=edFeOO-%%%%%%%%OO%%OO%&O&%&w%%&OO%%&O&O&%OyuVO%>uyuw>%%OOOO%%%O&&%%OO&OOOOO%OO%%OO%%%%Vw%>yAy>wwuuwwww>u>wVtuu>wyyw>-%%%%%%%%%%%%%%%>6tuw>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooOOedDOdy>;->6wuu,>wq>>1q11>>>>>>>>wq,,q,>>*w3**VD111111**>>>u*:uwu>,,www,>w,>3w3>>,>>>>>>,y>ww1=FCFS==w:&Vfd2CLdLSFe24Sddf5S2SELfof@oOoO&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%OOOO*TFO**O1DO*eO=3=;;>;;;>>>>>>>>>>w8>;>68>666>>>>>>>&Ouw>&>>&>uyw>&wVy,>6w8w>&&>wuOO*&O%>=OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>&O>Vi&OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%--wO33=4doSL3@3O%%%%%%%%%OO%%OOO%O;OOwOO%%O&%%O%&%OVV>y>&&&*=>=%OOOO%%%%O%%%>&O%OOOOOOOOOOOOOOOOw-O-uVy88wuwwwwuwZwwywwwuuuuyy8-%%%%%%%%%%%%%%>ww8>-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooO>T^TA&w%wwwuww>:wq>>qq1>>>>>>>>>:>>qq>>>*ww3=dD1*>1>>1www,w,%www>ww>>ww>>&>ww,>>>>>>>>>>>*>dC=3=ddou3w>>+L4oeS)LS234E=SdP5hEsEYYUe==oO=oOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%OOOOAyOO>yy&=D*3O1*;>>>;;>66>>>>>>>>8>;>88>88666>>>uu,Owwwu>&>wuyyw>wyu,;>u>86>wyVA=3&OO*OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&%OOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%O%OOoo===JE=o4o%%%%%%%%%%%%%%%%%&&%%OO>O&O&O%OOOO&T^y&O*OOO=3=OOOO%%OOOO%OO&&OOOOOOOOOO%%%OOOOOO%%%-->w8wuww8wuyDV8w>wuwuuuyyu>%%%%%%--O%--%->w-%OO%%--;-%%%%%%%%%%%---%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooO=&T>>wyyZVyw6>>>w,>>qq1:>,,qq,,>>,q>>>>w1**y*Ou%>ww1>wuwuw*u>ww:>ww*%>w>w,>,>:>,>>>>>,>>*y%uTdO4LDeCO>VF3S22o4Ce<Cdf2CeCsgssYWP^FdSS=oOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%--%%%OOO%O%3>>y31U3u**O%>>>>>>6w86>>>>>>>6>>>w6;88866>>>&>>O,%;>>>>>>;&&y>&>w6>>>www>,,>O>OO&OO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&OO%OOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%;O-;OO3o+dd^CoO+%----%%%%%%OO%%OO;OO&O&OO;O%O&%OO>OyD>3*OOO&wu=OOO%%%OOOO&%OOOO;OOOOOOOO=>>=OOO%%%%%%%%%wwuw86wuuGA>wuVA%wyyuutt%%%---;;%>8wwwwt>-%%%--->;-%%%%%%%%%--;;%%%%%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO==e=3OeCGD3&AV>i:*>wq:*>>>>>>>>>&:>>>>>>w1:>qwq>1qq1wuw>uwwq11111>::>>>>>>>>1qww>1ww11qw3ddeOu==wwwuyuwu>>ySwCCe2ee3=fdDf5hhLSgLgh4]Do&&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%OOOOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%=UTVDU&>>>>;;-->>>6wwww6>>>>>>>;6ww6>>>666>>>>>&wuw>&>w>>&&>w,>8-68uy>>>w3>&=>3OOO%%OO%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOO%OO%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOO33*>/VO.+.oo+o4+oOOO=O%=OO%OO&OO%%%%%OO%%%-;--%%OO%-%%%OOO%%%%OOO%%%%%%%%%%%%%%;86%%;>-%%%%%%%%->uuwwwttwwyy8;;>ZFyuVy-w6-%%-6wwuyye3>=%%%%%%%%,w;OO&&O%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoe+32d@4,wyAAVyy1>>1>>>q>>>>>>::>>>>>>>>q>::1q1>>qq>>qw1wwq1>>>>1>>>>11>>>>1qqqwqwwwq>::eUEF%1w1AVw>>:*,>yCdOyCeCd4dFF4FfY4KYKhhKLSYdoOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOei>wy%;;&;;>>>>>>68www6>>>>>>>>wutwwww66>>>>>>&>w>&%>ww,>>www>w8w-uFn>>&>w3=>e&%%%OOO%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOO==OOe^){]Cf5@o5oo=oo3Oo3Oe=>>*O&%%%%O%%%%%%%----%OO%%%O%%OOOO%%%OO%%%%%O%%%%%%%%%;-%%;>%%%%%%%%%O->wwwyyywww6yDT>uVVADGU6txw;-%%>>333=OO%%%%%%%%>w,%O%%O%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO=o3UF=dy&uV>yDA:>>:*:>>>>>>>>:&,,>>>>>>1>>>>>>>>q1>:>qw111111>>11q11>1q>>1qqq11>1wuyyuw=oO=yw31FVu>w,wy>uyCeDF2CCd@332SLLLKY)PWWhSSL@==OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOO%OO&OO,&&&;;;>>>>>>68886>>>>>>>>6wwwwww6>>>>>>>&>>&%%&wuw>>,w,>668%>Ay>w%%3w>VUw&%OOOO%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOO%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOO3eCC``^5(L52@@+eDeo4o3Oo&O%OOOOOOO%%%%%%O%%%-%%%%%O%%OOOOO%%%OOOOOOOO%%%%%%%%O%%%%>>%%%%%%%%%%->8wwwwwwuuwyDTywwuuwyA8ZFn>%OO%%%%%Ooo%%%%%%%%%>w>%%%O%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo=YDded%;w&,uO*>q>>>>*>>>>>>>>>>>>>>>>1qqq>>1w111>1qqq11qwwqq1>1qq1>1q>>1qq1>>::>wyiiyuCC*>>yO>,>>uwwue33FFDCeddC4JC2efSTYgsRPsg^YR2@oOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%=O%w&Ow>;&;;-;;>>>>>66>6>>>>>>>->>6>>>>>>>>>>>>>>>&%%&>w,>>>>>>>-8>>>&w&yDD>OD)w&OO%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOO&&OO&&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOO*O=OOoCQY'5WgY^SL^^YSL533eeeOOyOOO%%%%%%%OOO%%%%%%%%%%%O%%&%%OO%OOOOOOO%%%%%%%%%%%%;>>%%%%%%%%%%-;>6866wwwyyuuyywwyt>wytZZw%%%%OOOOOOOO%%%%%%%%O%>&%%%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo=oo+USoTF3O&uyy>qw1111>ww3>>>>>>>:>>>>,>qwq>>1ww1>quuw>>1qqwqq1>>111>>>>>1qq1>:q>:>1q1>OCF=&3LDwwwyVu,wyyeV333VedDfC=dEELLKKKRshEPY_S.+OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOO&&;>&;;&;;;;>>>>>>>>>6>>>>>>>>>88>>>>>>>>>>>>,ww,>&&&>>;;>>>>>>uw88&w>%O>3>>3>%OO%%%O%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOO%%O>yu;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOO=OOOo333pp(LKshSfWW#sJgh]fDS=o3OO%%---%%%%%%%%%%%%%%%%%%O%%%%%%%%%OOOOOO%%%%%%%%%%%%>>-%%%%%%%%%O%%;>wwwyw>wuuw8tutyyyyVnxw%O-&%%OOOOOOO%%%%%%%%OO%%%&%%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoO@ooFLd>u,>uwOOq>>>>:>quuw,>:&&:&&&:>>,>11>>:>qw>:wyyq:>>>111>>>>>1qq>:>>1111>>wq>::>>>eeOO>Oe3yiyyVywu>yee=w3we3eeLTDeDSLSgPhKssh)^+@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%O%%O>w%&&&;>>>8>>>>66>>6>>>>>>>88866>>>>>>>>>>>,wwww>&%>>>>>>>>>wu>wAu&wuyw>>>=%OO%%%OO%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOO%OOO;ww&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOO>o%>o@..JSsEPLI()'QSW]DFfC33>OO%%%%%%%%%%%%%O%%%O%%%%%%OOO%>w%%%OOOO%--------%%%%--%O%%%%%%%%-;;;;>>wwwwwwwynuuw>;wuuyu>%%&%O%OOOOO%O%%%%%%%%%%OO%%%%%%--%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO=o=O2@LEwy>&>wwu1*>uw:*quww>>>>>>>:&:>>,>>>>>>>1q:*1uw>:11>>>>>>q>>1ww1:>>>>>>>>1qq111qw=Fee1wV=>,:>w>:,&w3ddFeeAVdeeYUCeLdLPKg5sRPW[Y..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%OO%&&>OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%*%O&3>&&&;>>8w>>>666666>>>>>>>>>>>>>>>>>>>>>>>>>,ww>&%w,>>>>>>>>w%>Vw%uw&%;w3>%OO%%%O%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOO%OOO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOO%oo%O@+@.oSf@fSQhhLWP^L^^S3O%&&%%%%%-&%%%OOO%%%OO%>&O%%%%O%>w&%%%OO%%%%%%%%%%%%%%%%%%%%%%%%%%ww8>%%;>-8uuwwwu>;%%-8tyw8>w>%OO%%OOOOOO%%%%%%%%%%%%%%%&&&&&&%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo@o=ood^Vu3>,yyw1:uFAw:q,>>>>>,3,>>>:>>>q11111qq>**>1>:>wq11>11qw1>1uuq*>>>>>>11>qwq>:>>ueODF333ww>,u,:>3w3AVyeDC=eD3=2SD2d25fII)RWR_X.@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OOOO%&>OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&%O>>>>>>>>6>>6888666>>>>>>>6>>6wwww>>>>>>>>;;>>,>&%ww,>;&;>w&w>;>%>&;>w,>>>%%%%%OO%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%>OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOO&OO=Ooo@o@2+@o@.@+.$.ShC4eDSU4Dew,>;>6ww>>&&&;>&%%%;w>%%&>>&%%&&&%%O%%%%%%%%%%%%%%%%%%%%%%%%%%%6w8;%%>u>>>6ww8>>%%%%O%->>uyw%O>%%%%%%OO%%%%%%%%OO%%%%&>&&&&&&%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooo@<d,V%,uww*>wuw>>q>>>>>>>&%>w%>O:,u*1w1>>w>NT%u>q:>>1q1>>qw11qq>:>w%i:1**w>1q1>>>>=3O3*CCO>,ww>>>:w&w>uOwdd=3S=eFCCYL@fhSK)gPWP..oOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OOuOUV;>>>>>>>8>>>>>>>>w8>>>>>6>>>>>>>>ww>;>w8>w,>>>;&&%;,,>>uyw>uwwu&;>>>>>>>>%%%&%OO%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOoOOOOOOOooooooooooo+oee=_TATF;Ft-yyu;%&uy,VVw>>%O%OO&yViuu,&%O%%%%%%%%%%%%%%%%%%%%%%%%%%%-%O%->wy;-;6utw>%%%%%%%%>>iy>A%&%OO%%O%%&OO%;&%O%%%%%%%%>&%%%&%O%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooo@=/V>>O%>y1>qw1::1>>>>>>>:w>,>Vyw*u>>**1>%1uD*w1>uw>>1q1>>q>1q1::>**uquq:*>>11>::>ww=e>dC>>,w>>>>>wVF>wVDd>uewwCDCCFSLsfsgPgsIf2.@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO=OO&)TO>>>>>>>8>>>>>>>686>>>>>>>>>>>>>>%;ww>->u>>>>>>>>>>>>>uVF%>Vu&&%u>>>>>>66&%%%&%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOO%%%OOOOOOOOOOOOOoo=o@+oD3Oi>Ou>%&&%OOO%%Ouy,%O%>O%>uyyw>&%OOO%%%%%%%%%%%%%%%%%%%%%%%%%%%-%%%--;>>;->ww8>%%%%%%%%w%w,yD>O&%O%&%%OOO%%%OO%%%%%%%%%&%%OO%&>>;&%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOoooo=DyuUu:wyw1>>>*:>>>>>,>>>>*%Ou,&O>:11:1w*>%qO*1*Vw>:>wq>:111q1:>w*1%>:11*:>>>>::>ie=e=3u*>,,>>:>w;wy&>uVed>yD^Ue&doH`PKIIsWWf+..oOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO*OO3Ow>>>>>>>>>6>>>>>68886>>>>>>>>>>>>>>u>->6>>w&>>>>>wwuwww>>>>=;uw>3;w>>>>>>>>;%OO%%OO%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOO%OooOO%%%%%%OO%OOOOOOOoo=+oOoo%o=*O>;&O%%%&>&O%;%O%OOO;wuyu>%OOOOO%%%O%%%%%%%%%%%%%%%%%%%%%%%%%%%-%%%%;-%-;>>>%%%%%%%%OwUAw>>Vw&%%-%%OO%&&%OO%%%%%%%%%OO%OO&uV>>&%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooo+OuwA>*VAq>>>>>>>>>>>,,>>>>3%,&yF%:wi1%1qw*wqNy>yw>:>q1>>11qw1>qu>uOu>:1>:>11>>>>e3=3=3i&,>,>>>wywwuwwwydUe3eF==Did2eYEYPK__5.o@oOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&%OO>>>,,6>>>>>>>>>68w66>>>>>>>>>>>>>>t>%-ww6>,,wwwwww>;;>,>>&>%>=wu>>,>666>>>>;%OOOOO%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOO%%%OOOOOOoO+oO2oO&OO%oOO%%&>wuw>>%OO%%O>yyu,%OOO%%%%%%OO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%O=Feu>wyy,-%%%%-%OO%&&%O%%%%%%%%OO%%O&wV&&&%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooo@wFy&u,AF**:>11>:>>>>,,>>&,u&3>AU*wqq*%w%1>iwFy>O1>>11>1w1>1qq>qw:u>DV>*>>1111>11=>>3uALy>>,w,>uV>VVu>yVywwde=Cde35FSs5SPEI#@o<OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&%OOwd&>,w8>>>>>>>>688w6666>>>>>>>>>>>>%;w8>6>;w>>,www>Vu>&>wuyOO>==,&,>>666666uuw>%O%&%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOO==&OOOOOOOOOOOOOOOOOO%oOOoOOoOoo@oooOO%%&>,>O%&&%%wDVu>%OOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%--%%%%%%%%%%%OO%Owww&ww>>-%%-O%%%%%OO%%%%%%%%%%%OOOO%%%%&&%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooOOui3VOwA%:111q>*>>>>>>>>**>%3%3d:y*O%iFO>>qOuqyu1>>1>:1w>:>1q>>1>qwFN*%>>1qq111q=331yFUi>>wuw>uV>wwu>w3uu33>u/UdTDpSSKPWK@.oo&&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO=OO&%OOw>>,6>>>>>>>>6666>6666>>>>>>>>>>>ntw>6w6>>;>>www>Vyw>>>>>>O&&3y,>>>668888uyu>OO%&%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOO*>3=OooooooooOOOOOOOOO&OO>oo+O+oo+oo@OOOOOO&=OOOO%%3A>&%OO%%%%%%OOO%%%%%%%%%%%%%%%%%%%%%%%%%%%-%%%%%%%%->>>%%%%%%%%%%oO&OOO%&&>ww>%%%O>u>%OO%%%%%%%%%OOOOOOOOOO*==&%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooO&wDDVwAU1uyuwq>*>::>>>>>w>>>V>*%:u%1uND*wu>%1uFUw1>>>>>11>>qww>>q>u1q:*>>>11111q33u1wuF>>>wuw>wyyw;iuywiu>yyFUFLiFTLS)`hood@&O;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&OO&&ww&>>6>>>>88666>>>>>686>>>>>>>>>>>Gy-wyw>>&>ww>>>w%&>www,>eOO*eAw;>>>68wwwwuw&OOOO%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOO%==OOooooooooooOOOOOOOOO%*Oo@Oooooo..O*%OOO%%&%OO%*O%%OO%%%%%OO%%OO%%%%%%%%%%%%%%%%%%%%%%%%%%%-%%%%%%%%%;>>-%%%%%%%%%==o%O%OOO%>>;%%%O,yw%O%&%%%%%%%%OOOO%%%%OO%*&%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooOOOFU&yw*yVAiuwq>:&&>>>>:>*>wFu,>>q:FA%w*%w*y1qqAyw:>1>:*w1>wyuq>:*V:uy>%:>11>>113=313%y%>>wyw:>uwZuwwDA3DVVwUDwDdfYfE))2o@oOO&O-OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO3O&OO&u&;>>>>>>ww866>>>>>686>>>>>>>>>>>y%;AF>%w>uiy>&>wwww,>>>>&O==>w>w>>>68wwwww,&%%%O%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOoo.....oooooooOOOO&O&OO%Oooo+oo@ooOOOOOOOOO%%OOOO%O%%%OOOOO%%%%O%%%%%%%%%%%%%%%%%%%%%%%%%%O%%%%--%%%%%>>-O%%%%%%%%oOo=OOO&%%O%%%%-O%;&%%OO%%%%%%%%O%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOO%OOOOOO%%%OOO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO+o@5Y.5LEso23==ew=1O1:u:>w1:>1>>>>>>&>>&:ww3,*>yADA>>>&&DA,>yw*w:w>,i:Ow:,3>>,3>>w8wV>w>%wVy>>&>>>A>AwwAULddUYLLWKJL^LoOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooOOOOOOOOooooooooooOOOOOOOOOOOOO%O=OOOO>>>>>>>>>>6>>>>>>>>>>>>>>>>>>68www;->O*Cd==33>>>86w;6w>>>%U>&&>u&%>>>>>688,,>&%OO%O%>,&%O%O%%OOO%%O%%OO%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%O-%V%u%->>-%%%%%O%>-O%>O%%%%%%%%OOOO>y,OOOOO%%%OOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%",
+"OOOOOOOO%OOOOOO%OO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo5o_^fLJTD+==O=3wd11O1>*:>1>>>>>33>>>>>%:>>wwuAVFd>3w>>ww**w:%>*DFw>>%>&>,>>>3>&;wyDuw,>&ww>>>yyOyywuVu3eeefhfsKSsRT@oOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooOOOOOOOOooooooooooOOOOOOOOOOOOOO*%O%OO%%>>>>>>>>6>>>>>>>>>>>>>>>>>>>>6886%u&OUU==3w3%%>u868wwwu>u%&;;>>,>>>>>688>>>&%OO%O%>>&%%%OOO%%%OO%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%O---;6-O%>>;--%%%%OO--%-%%%%%%%%OOO%>w>%%OOO%%%%OOOOOOOOOOOOOOOOOOOO%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%",
+"OOOOOOOOOOOOOOOOOO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooo@@@_[aa+UL=@=O=oowi**y%>%wyq:q>>>>>>>>>>,>>wwwdww>%>,&:%>>>3>:wODD:%>>:&>>>>>,,u>uwi>%>w%,uyyeFVyuuVAuy3ddfSJSf5WJSf+o@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooOOOOOOOOoooooooooooOOOOOOOOOOOOO%OO&%&yw>>>>>>>>6>>>>>>>>>>>>>>>>>;>>;>>6-FDe>==@O&>>&>w6ww>>ww&O>%&>&,w>>>>>688>>>;%OOOO%%&%%%%&%%%%%OO%O%>>%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%wO%-A%%8%wt8>>>%%>%wDVO%%%%%%%%%OO%3uw>&%OOO%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%",
+"OOOOOOOOOOO%%OOO%OOOOO%&%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooo=oooLd2<<dC3=>>e=1w1>1*u*yAw:q>>,>>>33>ww>&>>:3wwwuyuww>wu3>,ww>yw%>>::&>>>>>,3>&w%,&&u&%wyew=e3u=&AV3uyUe@LD$S)W])o@+oOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOO%%OVDu>>>666666>>>>>>>>>>>>>>>>>;;;;;;w>&>>oe`LeO&ww>>;w8;>w>&3yOOw>3&>>>>>666>,,>%OOOOOO%%%%%y>%OO%%%%O%ww&O%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%OO6A/yO->xVu>ww->>O-Vu%>%%%%%%%%OO>VAy,,%%OO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%",
+"OOOOOOOOOOO%%OOO&OOO%OOO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooOO=oooUad=eDCw,>CF=Oe1Oiw*yAq*,:,3,>3ww,3w>*>,>wwwyVVuww33,:*>3>Vu::3>%*&>>>>>>,>yFwe>=&>wCdw3O%>OeyAyDwC3dSdCPL(Y{)o@ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOO%OOuF&>>>666666>>>>>>>>>>>>>>>>>>>;;;;-tw&y>OL)U3%>w66-w6;wuwu>yOOw>,&>>>>>>66>ww>&%O%%OOO%%%%y>%OO%%%%O%ww&%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%w-OyVut8VVw>wu>w>;-%->-%%%%%%%%%%>VVuwu%%OO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%",
+"OOOOOOOOOO%%%%OO%OO%%OOO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooo2=CC@de3AAuye1iDu3uw:O>u:%>:>>>>>ww>,w,:3w>3>>udw,,>u>,w>,w3iuw>&&:&>>>ww>>>yFFey=u=>uCywu>>eeFdDyDy=3O+fChLpKYo@2o%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooOOOOOOOOOOO%OO&%&w%>>>>>>>>6>>>>>>>>>>>>>>>>>>>>>>>;%&OO3==UF3=>>6w>t6;w,&uO>%=3>>>>>>>>>>>,ww>%%O%%OOOO%%%&%%%%%OO%O&ww;%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%O>%;wn>;>uy>>wuw>;uu%%>O%%%%%%%%%O%ww>wy&%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%",
+"OOOOOOOOOO%%%%OO%OO%%O&u%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooO=&Ooo4^+d3%VAyAF1DEded****:**:>>>&&>ww>>uw>3,>>w>uywuywy,uVuwu3u,>>&>ww>>3uw>:>>e%3C3DCOOw333*>3Ce=A3uyDSdefSSfL+.ooo%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOO;>&,>>>>>>>>>6>>>>>>>>>>>>>>>>>>>>>>6y-wwO===o+>3,>>86t>>t>%yy&===>>3>>>>>>>>>,>&%OO%%%%%OOO%OOO%%%OO;;>>>>&%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%-%O>>8wZ>88>>6www>-%%OO-%%%%%%%%%%%>wwwy&%OOOOOOOOOOOOOOOOOOOOOO%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%",
+"OOOOOOOOOO%%%%OO%OO%O%yD%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooOOo&=oaUUe3VVuyVui*eAiOV>w>%*>:>ww,,wyuw%w3>,3>>,*>>*wy>w&yAu>>%A>*wuwww>>wuu>&>4eodL=Cwe=eVdwO=23=w>uDVeyFe@SYhf2@@o=oOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooOOOOOOOOOOOO>O%>,w&>>>>>>>>6>>>>>>>>>>>>>>>>>>>>>66%8w%uwo==3ew>>>;-6;6VuwFY3=%*u>>>>>>>>>>>>>&OOOO%%%%OOO%O%%OOO%%,ww>>>&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%O-w>;tAV8666>>>6>u>yFwO-%%%%%%%%%%>wyyuu&%OOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%",
+"OOOOOOOOOOOOOOOOOOOOOOOO%w/&O%O%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%OOOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooOOOOooooTC=*>,wyeu3VSUwu:uw:w:%w>>&>ww>>>ww>>,,>&>wuw>>w3V*&u&uFOuw*wu>>>&3w:*&%d@YDC2e3+O=DS>3==ddeACVFyDV3<2FLfo@ooOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooOOOOOOO%OOw>w&;>>>>>>>>>>>>>>>>>>6886>>>>>ww88w6>>,>===CCO=u;8w66w->>&uye=d=3u3>>;>,>>>>&wy&O%O%%OO%%%%OO%%%O%;,w>>ww;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%-;tw8;%%O%-;>6>6wyDx>>ww6>>>>;;-%O%%%%%%%%%%-8uwwww%%&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO,&OO%OOOOOO%%OOOOOOOO%%%%%%%%%OOO%%%%",
+"OOOOOOOOOOOOOOOOOOOOOOOO%OAOO&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%OOOOOOOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooOOOooooo+eCAVuw>e1d1VDDVFy*%:uu**ww>>>uA:>>>>>,>wwwuw>>www*yLDVAA>:3OuA3,>yuw%uy5f4eSoC@e3=Cd=3>=2FwVwDAd>&dSUfL^d@==OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooOOOOOOOO>w&3d;>>>>>>>>66>>>>>>>>>>>>>6>>>>>6>>;;>w3>=3FC=%wuu>>;6>wu&>=w=3d3>&>>>>>>wuw>uy&%%O%%%%%%%%%%%%%O%;ww,>ww>%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%->8wunyt;O->->66>6wtZu>>ww6>>>-%%%%%%%%%%%%%%%-8wwwww>>==>3OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&&&OO&;OOOOOOO%%OOOOOOOO%%%%%%%%%OO%%OOO",
+"OOOOOOOOOOOOOOOOOOOOOOOO%OOO%%O%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%OOOOOOOO%%%OO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooOOoooooooeDSdyyweue1UAdUUViy%>uO*ww>:>yD>:&>>>>3,,3wwwuVuOyOyUOyO%>V>w>>3*ww3%udf254f@43o@==O=e>=+See3Fy>y3LFCdL_CooOoO,OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooOOOOOOOFy>uDw>>>>>>>>88666>>>w8>>>>6wwuu6>86;>>>>>====+3w>&>w66w>>,&w=3=OC==3>>>>>>wVw>ww&%%OO%%%%%OO%%%%%%&,ww,>ww>&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%->wuywVynw%w>>>86>6wuw6>8ww>>>;%%%%%%%%%%%%%%%%-8wwwwuyw>ue=OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%&%O%&OOOOOOO%%OOOOOOOO%%%%%%%%OO%%%%%%",
+"OOOOOOOOOOOOOOOOOOOOOOOOO%O;OOO;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OOOOOOOOO%%OOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooo@efe3dAVdOOdyuyDUyyy&&u>&>**wwwuu>:,3>>3>>>,wwyV>AV%%uw3AV3i,,%yw%%w>&>w@2YS242@Dd43==>*=4dC3dd3V*CwdEfLe@oO==OO%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooOOOOO&Vw%,V&>>>>>>>>88888888w86>>>66wyy6>ww;6>>>&%=e^eO=>w;tw68;wu&>===eCO=w>>>>>>wyw,>>%OOOOO%%%OOOOO%&>>wuww>>ww>&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOO%%%%%%%%%%%%%%-;>wuuyyV8yVuV>>6w8>>ww>>6ww8668>-%%%%%%%%%%%%%%%;8wwwwuyw3dwOoOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%wy>O%;%OOOOO%%OOOOOOOO%%%%%%%%O%%%%%%%",
+"OOOOOOOOOOOOOOOOOOOOOOOOO>O>OOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OOOOO%%O%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooo@+=eVVOSe>DF=dTV>,w>&&*&%%ww:&w>>33>>3,3w,>,33>yUV>u%y_F*VdDAO,>&A>u3i44aLS2L`)C=eV=O34CeddFey>eC3edDFDSeOoO%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooOOOOuww&,%&>>>>>>>>88888www68ww86>>>uu>>ww;>>>>=>dD)d&>wu>tw-->VA>%=o3UC===3>=>,>3w,w>%%OO%OO%%%O%%%%&,wwwww>>>>>&&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OO%%%%%%%%%%%%%-%%>wuuuuxVwyVVAwwww8668w>6w6>>8ww6>;--%%%%%%%%%%%%>wwwwuwu3ed3o=OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>w&OOO%%OOOOO%OOOOOOOO%%%%%%%%%%%OOO%O",
+"OOOOOOOOOOOOOOOOOOOOOOOOO&O&O;%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OOOOO%%&%OOOOOOOOOOOOOO%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooo.ooOO&3eCyeoVOyuDAVVVy&O*>&*>>:w>:>>>>>3:>>>>,>>*V>DAOVy&*uVuO%u*wyF>yyF2Lf+fY^[S2=4w3=34d42CyuCAODwCC3e2<oo=O%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooOOO%d>wwuOw>>>>>>>>66888www68www8>>>ww>>ww66>>>>3dF==eu>,>6>>8;6uwA3o3Ye=3=3>=33>>>>w;O%%O%OO%%O%%&>&>wuw,>w>>>>&%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%---%->wtyuutyxtynyuwww888886ww>>>8www86>>-%%%%%%%%%%-6rwwwuuu3ee=oOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%yy%%%OOOOOOOOOOOOOO%%%%%%%%O%OO%>w>",
+"OOOOOOOOOOOOOOOOOOOOOOOO&OO%O>O%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OOOOO%%w;OOO%%OOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooOOOOOOOOOOOOOOOOoooooo..@@ooooO=wCDL_d&u>>AFVDDw&w,>>>>w%>w,>>>>%:>>>ww3yw>ViwdA&w&*TDdD*>yywuVysShYYD2L24Fe=3=&24ddd=>dwuDLFOSUYD+O&OO&%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooOOOO>>>>;%>>>>>6666>>66888wwwww86>>,,wwwwwww>>3w323ed3=wuu-;wx;O%,De=3d=@e>>>>33>>>&w&O%%O%O%%%O%&>w>>ww,>>w>>w>&%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%---->>wutttutwZutAwuww888ww8>w8>;>w8ww8886>;%%%%%%%%%-6ruwwyyuu33e3OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%&&%>AFw%%OOOOOOOOOOOOOO%%%%%%%%O%%%>yVy",
+"OOOOOOOOOOOOOOOOOOOOOOOO%O%OOOO>OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OOOOO%%u>OO%&%OOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooOOOOOOOOOOOOOOOOooooo....ooooOOo3VeVU>&eV;w,&UT%,w,,uw**%wyw>>>>>3,>>ww>>u*>>>yO>*u>Dwuyw%wOyuV%Sh5[)@4oD+=4w3Oe=4CT3=OeF3wd3@ef3eoo=O%O%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooOOOO&d3>&u&>>>66888>>>66888www>>>68>;>686688;&wde=OOCedV,ut88u8uu%;=33O==eO=>33>=>w%>%O%%O%O%%%O%>ww>;>,>>ww>>w,&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%%%%%----uuuuuuuuV>ZuAUyuww88www8>86;;>w>w6>6ww6>%%%%%%%%%;8tuwwywwe33DD3OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%&OO%O%%OOOOOOOOOOOOOO%%%%%%%%%&%%,yyw",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&O&OOyOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo4L3d^D-t-wVwwuw;3dOee=O3Fd=oe@w>>>:>u,>u>ww>w:>>>=eO3de3>3V;&>5SC5S2S45@C=3d>y4=eD=>uywue3CSoSu%&&OO>OOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooO>u,;>6>ww6>6ww6u6>ww6>6>6wuw88w6>>>66>>w%wnwwu-;&%Fye3eedeOeuw%>>>>ww>&w>&&>>&%OOOOOOO%OOO%%>>8>>>>www3>3>>3&O&%%%%%OOOOOOOOOOO%%%%%%%%%%%%%%%%%%OOOO%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOOOOOO%%OOOOOOoOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%%%%%%->6>>>yyuutyyyyyyyyutyuw>>wuwww8>>>>>8wwwww888>>;--%%%-6rttuww3yFe3T^4o3oO%%%;%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%OOOOOOOOO%&%%OOOOOOOOOOOOOOOOOOOOOO&&O%uOO>",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%O>%wUAOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo$.@4dDGy8t8yywyF>d>_^we=d==E_=23>>,w:>w>ww*ww*>,=>3eA=>=A=D>Owuwffd52aSa2@S+d*&uY=Oiew>iuO3i3CeSUw%&OO&OOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooO>uw>68>%6tytr86>>>ww68www>>88>>wwwwuuww%wwuwu>;>VuOODf=Df2C%>>V>,,,,>>>u,&%%%%OOOOOOOO%OOO%%;>8>wuw>;>w3>&*&OoO%%%%%OOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOOOOOO%%OOOOOOoOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%%%%;%%->6uxyyuuyyyyyyyytuutuw>>wwwwwww86>6www886>>>8886>;-%66rruwuuu>dd3CDCOoo>O->%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%OOOOO%&,w%%OOOOOOOOOOOOOOOOOOOOOOVDF>&&>O",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%O%O>DVOOOOOOOOOOOOOOOOOOOOO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.+oeC&FAwwwwwuAUVOALe%3e3=T]d==>>uu>>>>:w>ww>w>3>=3C>>&>=C>AAuUf=+SSYSf5o@@Jd>OfeeOOeyVuHSefYLJD;O%OO%OOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooO>ww>w8>wwyADDZ8>>6ww8wtVu>>wuw>888wwwwwyDu%Ow-y&>we3=+Y`D=3u3wO>,>>>>>>yw;%%%%OOOOOOOO%OOO%%;>8>,www>,w3w>>>OoO%%%%%OOOOOOOOOOOOOOOOOOO%%%%%%%%OOO%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOOOOOO%%OOOOOOoOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%%%%%O-wywuyyytyyyyyyyyyyutyuw66wwww8wuuwwwwwwww86>>wwwuww>>rrrwwwuu,3ew=3ddOOOO&%%;%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%OOOO%>wy%%OOOOOOOOOOOOOOOOOOOOOOTUAuOO>3",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%O%OO>OOOOOOOOOOOOOOOOO%OOOO%%&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.@2o+=OUTw8>>u>wVUV3OO3>O3e+UC==w>uuwww>*u>%%>u:3>&>C33=%dO*D>&VCfeLf45Y5foe3=3Do54d4O=C&Di@eHLf>OO%OO%&OOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooO&wwwww>w>>wZAx6ww8868wuVt>>wuw>w86686>>wDVA>uO>yuu3LUeLEDC=u>y;w>>>>>>>u,&%OO%%OOOOOOO%OOO%%->w>>>wuw>&=wuee>Oo%%%%%OOOOOOOOOOOOOOOOOOOOO%%%%%%OO%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOOOOOO%%OOOOOOoOOOOOOOOOOOOOOOOooooooooooooooooooooOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%%%%OO;yVuwtyyyyyxxyyyyyyyyyuwwwwwwwwwuuwwwwuuwwwwww>wwutuuwtrrwwwuuww3=>3edo=&O>OOw%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%OO%;>%%OOOOOOOOOOOOOOOOOOOOOOy>uTF&OO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%&OO%OOOOOOOOOOOOOOOOO%OOOO%%&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.o@O%FTuwwwyww>>TA%uO=O>3o+3O4w>>wwuu>ww%***ww=>3eF33=eC3O>&V&FeeYLfSffS2SC>=y4D2SSf4<F=od44LfO%&%OOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooO&>,www>-6w6>6wuww>>>8wwuw>>8w6>wwwwwww6>wtD>u>w%yVOFDO3oCddwuO,w>>>www>%%OOOOOOOOOOOOO%O%%%%->ww>>>,>3u%>33w=oo%%%%%OOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOOOOOO%%OOOOOOoOOOOOOOOOOOOOOOOoooooooooooooooooooooOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%%%%-%-wwwuVyyyyxnxyyyyytutyuuwwwwwwwuuwwwwuuuuwwwww68wwwuuurrrwwwwwyw=we=>C=oO=O%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%OO%%%%%%%OOOO%%OOOOOOOOOOOOOOOOOOOOOO&%OwOO&%",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%OOO%%%OOOOOOOOOOOOOOOOOOOOO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...@@o=>AwwwwyyVwy%w>>UO&3oe==3=w**>>wu>w*:FF>:w=3>>d=3=3wV=eedCS4CL24(L4fDLJow3sL$2aSfoYfeShfLg%>&OO%%OOOOOOOOOOOOOOOOOOOOOOOOO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooOOOOOO%&>3ww>8uytwwtt6w6>>6wwwwwwww86>>>8wuuwy--VO-8yAw&3TDo3=e&3DF%w>>>>,>;%OOOOO%%%OOOOOOO%O%%%%->w;>ww>>VL=3=%&&OO%%%%%OOOOOOOOOOOooooooOOOOOO%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOOOOOO%%OOOOOOoOOOOOOOOOOOOOOOOooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%O%>wuutxyyyyxxyyuutuuuuuuuuuuuuuuuwwwwwwwwwwwwwwwwwwwwwwrwwutuw,wyyw>=3ddeoOO&%O%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&%%OOO%%O%%%%OOO%%OOOOOOOOOOOOOOOOOOOOOOO&O%OO&O",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.oo+ooO%>u>>w8tywuV&>yDuOwO3333o,**>>ww:>>wDDw::33&Ou&w3*>3=C2oeC=4f5aL@L5s5F3Dd55f+5+aSfCSfhfg@%%OOO%OOOOOOOOOOOOOOOOOOOOOOOOOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOO%&,ww,w8>6wt8->uxt86wwuwwwwwww--;>wwww>>>y8>%%O>uuLd=e433&DuiD;>ww>&%OOO%%%%%%OOOOOOO%O%%%%%>w>>wuw3VD>w=OOOOO%%%%%OOOOOOOOOOOoooooooOOOOO%%%%OO%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOOOOOO%%OOOOOOoOOOOOOOOOOOOOOOOoooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%O;uyyyyuyyyyyyyuuuttuuutuutytttyuwwwuuw8wwwwwwwwwwwwwwwwwwwwwww,>VV3&we>yTO>O&O>%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&&%%OOOOOO%%%OO%%%OOOOOOOOOOOOOOOOOOOOOOO&%&3OOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%&&O&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.o.oooo+3V%%w>w-V&u,DF;&=O3o33o3>*>,>>w:,u>%%:u>=2>3Aue>3u%3e4L+2455s$ohs2SS4=FSsS)hgSY^4@LYSSL.O%%&&OO&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOO&>w3,;wuw>>8w>VFAu>8wtww8www6>;>>8www6y>%ww>uw;OwEUdOee>e>>%>>yVVw&%%%%%OOOO%OOOOOOO%O%%%%%>wu>>ww>&&=3=OOOoo%%%%%OOOOOOOOOOOooooooooOOOOO%%%O%&>>&%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOOOOOO%%OOOOOOoOOOOOOOOOOOOOOOOooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%%%%%%%%%>uywwynyxyyyyytuyyyyyyyyutyyyyyyuwwuyyw>wuuuuuttwwuutuwwuw88wwwwV>>uew3>3TFYOO>OO%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>&%%OOOOOO%OOOO%%%OOOOOOOOOOOOOOOOOOOOOOO&OO;OOO",
+"OOOOOOOO%OOO%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..ooo@=3yCyw;V;uy%wVyu&>udF=3=O:::>ww,>%uw%>>:u=eO=OVO>w==3f=U4F4d4ff#PLSs22SDTRY{`S^@$5s5@p)D.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOO&>>>u&>>uy>88uwwuw>wuww>www>6tVxw>8uww>>uw;;wUw>FuySdw3wuw8>&wDD>O&O%%%%%%%%OOOOOOO%O%%OO%;->ww,>3ww>>&OoOOo%%%%%OOOO=O=OOoOo+.L5o2oOOOOOO%%O%&&&&%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOOOOOO%%OOOOOOooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOO%OO%%OO%%O>;%&%%-OO%-->wwyVxyyyytyyyyyytxyyyyyytuuuyyyyuyuwwwww>wwwuuuuuu>n>uwuuwwwuuuuwu,,uw;3Cy3dF=D3O=OOO&%O%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%>>OO&&O%OOO%&O%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOO%%OOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..oooo+EDED&>VFVFy>;%uy;>yVe=3>***:>>>>:u>%>>wyd3=eLwiVw>e4@aYLYWf5KfSPPh .4SLhEPLRI4gKP2SfS]4@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOO&;>>>uy%-VVy;>;;>>>8wuuwwwww8wtuw>>8;uy6->uuU/>>&UCTe33,www6>%,wOO&O%%%%%%%%OOOOOOO%O%%%%>6>>ww,>>,>>>&OoOOo%%%%%OOO%OOOOO%o@.2`^@o=OOOOOOO%OO%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOOOOOO%%OOOOOOoooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOO%OO%%OO%%O,>O%O&;;>wuuutyyxyynnyyyxxxyyyyyyyyytttynnyyyyytuwuuw8wwwwuuuuyOwwu6w>uuuuuuuu,>,wwwyFLdd>eSLLo%3OO%%-OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%>w&OO&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOO%%OO&&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..oooo@d=Cyy>-wyFVw>&,,&O%>yO>>*%**>>>>>w>%>wuVeF3V^yuA&y3odYKKSYJI#PPRWIPYS5fgS#X)ssIXIfPsE^o@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOO*;>>>yw>wuAwwwwuutywuyw88ww688888888ADnO>Vy%ut;>FOO3uw>>ww>u%%%O%>O%%%%%%%%OOOOOOO%OOO%-6w>>www>>>>>=%OOOOO%%%%%OOO>O&>O&O=.@5L4@ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOOOOOO%%OOOOOOooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOO%%%%%%%%-O>;%>;>8wtyyxyyyytuynnyyyxxyyyyyyyyyyttyVVVytyxytuwwwwwwwwwwuuuyVw8UF-Dwwwuuuuywuuw,wudw=e=CeedOo>OO&;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&ww%%&%O&>%OO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOO%%OO>iwOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&&%OOO%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.oo..o2C=wD>ww>yyyu>&>&&&FD==O***:>>,>,w>*>wuiee3SVwyOu==2fYK#g#J_PEIIWsPKsKJPL5PKXIPpSI^)ToeoOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOO&>>&uyu>&u>6wu8wuuwtyw888>>>688wut>>u>OtA>;yUVVd333yy,>ww>w>w,OO&%%%%%%%%%OOOOOOO%%OO%;>>;>www,3,>>=%OOOOO%%%%%OOOO=OO=`TO+oooo+OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOOOOOO%%OOOOOOoooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOO%%%%%%%%%O>>>yw8uyywwtywwuuuuyyuyyyyyyyyyyyyyyyyyyVxyutytuwwww8868wwwwuu6A8-UAOFwwwwwuyyuiyw>>w>3w=3d3@eLOo&%&%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%O%wVy&%O%>%O&%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOO%%OO>iwOOOOooOOOooooooooOOOOOOOOOOOOOOOOOOOOOOOO&&%OOO%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.oo..ood3udOy8;wyu;O&Fy3OVi>==***:>,,>,>>,>>wuaF33OwOw&F42LShS(YsXPI')WsIKhPIPI$PY WYgPY.foo2+OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOO*>>wi>,Vw%>;wu>>uwuuuwwuw>>www66uyUy>wuFD8txyuO%3V3ey>&8w>;,uw%OOO%%%%%%%%OOOOOOO%%OO%>6>>>wwwwww,=*OOOOOO%%%%%OOOO=OO=`TO3oo==3o%OOOOOOOO%OOOOOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOOOOOO%%OOOOOOooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOO%%%%%%%---yt8uwwwyu6>wu8wyVntuuuuuutyyyxyyyyyyyyyyyyyyytuuww868w68wwwwuuy6uw>w>6ww3,wwuywyy,>wuwey33Cd<C^eo*OO%-OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OOO>Vi3%%O%%O&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOO%%OO&&OOOOooOOOooooooooOOOOOOOOOOOOOOOOOOOOOOOO%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.o...@+odd>wA6w8w>66>AV>%wO%&3%%%:>>>>,>wu>>wwf@dF>wu>%=eSLKQPsKW5IP~I#R)RjQ)R2o$#^hgKRP)^o=oOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOO%&euywuVu,w;wu>8ywwuwwyyyw6wuw>>8uDu>>O%wy>->wu>>==3w>&686>,>>&%OO%%%%%%%%OOOOOOO%%O%;wwww,ww,wuww=%OOOOOO%%%%%OOO>O&>O&O=%OOoo%OOOOOOOOOO%OOOOOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOOOOOO%%OOOOOOooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOO%%%---;>;uDV;>>w>wuuuuw6uVFAyuuuuuuyyynVyyyyyyyyyyutyyytytuw88wwwwwwwwwwyuVy>yyVyuw,>,wwwyywwuuw>*d=DF==D=OOOO%-OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OO%%%>y&uOO&O&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOO%%OOO%OOOooOOOooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.o..o@Sae3w-u>u66%yFuw>%DD>w>O%%*>,w>>,>uy>:wuo23dUy&yww3fYEIQPgRg#KsRWWQ)j$gPS5.#KgSY5fL2@=o,OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOooOOOOy,yViu>yV>;>%8y;wuuuutuw8www66ww>>ut>-VU8%u>FF>&==>>>>8www,>>&%%%%%%%%%%OOOOOOO%OO%>w88www,>,ww3=OOOOOOO%%%%%OOO%OOOOO%oOOO&=OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOOOOOO%%OOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOO%%%;>>8wwwAt;8>>>>wutwwwwyZVyyyyttuutyyyyyyyyyyyyyyytttyytuw66wwwwwwwwww>nw8yx-Dyuw>>,wuuyuuwww8y=dofL2<ooOOO%O%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%&OOO,wD>O;O&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOO%OOO%%%%OOOooOOOooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.o..o+aESU/;;x>wtO>Dnww%TFO&w&%%:,www>w>yV>*uy<D3FEDFDUVed4YhKSYPg)'KsW)~RjRIhLSEPL)SgKRo+O@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOoooOOOO%uFiwu>>UVwu8nZ>wuyu8>>>>>>8wuuuuw>wVyww;wuFy/Ow3>>,8>6w;uyw>%O%%%%%%%%%OOOOOOO%%%&>6>>>uw,>>ww>=OOOOOOO%%%%%OOOO=O=OOoOO;OO%%=OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOOOOOO%%OOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOO%%%>8wwyu;>->Vy;w>>8w>>w->wwuyyytuuwwwuuyyyytuuuyyxywwwtuuww>>6wwwwwwwwwywwVwu-Auww>,wuywwwwwwwww*3=4^2=4<=O&&O;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%&OO%%OuUuO&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"%%%%%%%%%%OOooooOOOOOOOOOOOOOOOOooOOOOOOOOOOOOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooo..o.@@o2DUdCyuw>Vt>%Vde=3fLoe=O%%%6w>>ww;;>&&3w*2S34d+5@hY.LgS$s)s#ghWKj`['PjXW`IIQ`{{)Y[fo=%%OO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%OOOOOOooooooOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooo......oooO%%%OOOooooooooooooo%%%%%%%%yUVun;u-TA6>wtt;wwwwwwwwu86ww66wwyt%Zt6>&e=332f4@=+=&;97>&>ww%O%%%%%%%%%OOOOOOOO&OO&>>>,688wwuw>%%OOOOOOOOOOOOOOOOOOOOOOOOOOooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOO%%%&>wuuuuwuw>wAF3ew&&wuw>wuytutyutyuwwwwwuyyyuuuwVtwyyywyw>ywy6>88wwwwwwuttuuyywwwuuuwwwwww88ww6>u>Le4^4@4a2o+2o%%OO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"%%%%%%%%%%OOooooOOOOOOOOOOOOOOOOooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooo..o.ooofe4e>>>wyw6Vu>333CJ++o=eFt6;;%->6&wu>y>>3o=YdoCf2S$PRsSEKg))WWKKKW'`RXR'gfSLW'_^^YOo&OOO&%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%OOOOOOooooooOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooo.....ooooO%%%OOOooooooooooooo%%%%%%%%>Dywy6w>t;->6wytwwww8888>8wwwwwwx%>nD-;we3e2F^)S222ww676>>>uw&O%%%%%%%%%OOOOOOOOOO%wyw>>68wwutw>%%OOOOOOOOOOOOOOOOOOOOOOOOOOooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOO%OO&wuuwuw,w>uVA%*=wuuw>,wutuuuuuuuwwwwwuyyyyuuuuyyVt>tywuw8%%;y>>8wwwwwwtyuuttwwwuuuwwwwtyuwwww,&udoD)+54@fL3o=OO%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"%%%%%%%%%%OOooooOOOOOOOOOOOOOOOOoooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooo..o@o+UTed%>wwwtxuOwLeoLDoeo=eSw-->;>>;wu3wDC3>OCCe224+2fSK)))LsIKIR$gQ}''[)~XR55@.@..o+o=&OOO%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%OOOOOOOooooooOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooo....ooooOO%%OOOoooooooooooooOOOO%%%%Oyu8yt8wZtyxuwuwwwww8866wwwtuw8ww>w&u&Fw3+fL.445+oo>,wr9w>wuu&%%%%%%%%%%OOOOOOOOOO&wyu,>wwwwuyu>%%OOOOOOOOOOOOOOOOOOOOOOOOOOoooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOO%OO&wyuwy>;>>uyy3&>VFVuuwwuuuuuuuuww66wwyyyyyuutyyyVw>xwuuwuAy>>>>8wwuwwwuyuwuuuwwwwwwwwwyxywwwwu>3&3LYDd@2ET=&o&&%OOO%&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"%%%%%%%%%%OOooooooooooooOOOOOOOOooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooo...o@o=YU333wuy>tu->F=2DD+2=+Oo3>%-8666&>u>>3uwd==2ofL4dLfL4fL$@shSKhhIIKPR{`5`K@@..@2+=o==OO%OO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%OOOOOOOOOoooooOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooo....ooooOO%%ooooooooooooooooOOOOOO%%O>ywyn>ux6>wwtt8wwww8666y86yy&&w;,u=3eTF+foEEE^2K523>667w,wuu;%O%%%%%%%%OOOOOOOOOOO>wwwwwuuutyw>%OOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOO%%&,uyuuu>;>>ww>3&&wuwwwwuuuuuuuuuww>6wwyyyyuutyyyyuwAD>yywtTDwO>>wwuwww8uyuwwuuwwwwwwww8uyuwwwwuw>>CCeE+23f4STO&&%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"%%%%%%%%%OOOooooooooooooOOOOOOOOoooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooo.oo..ood3>uDywy>>n&OedTFdo3o=%=>y8>>%%>>&>&y>Ay3%=32eUYeffDUSSf2s5YIfSs$X#R_R5@.o+=@ooooo%oO%%O%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooo..oooooOOOOooooooooooooooooOOOOOOOO%%yuuy-w6-;8wttwuwwww866uwwwwwwwwO@3=o3+o5)PLKssY523>w69wwwww&%O%%%%%%%%OOOOOOOO%OO%&>wuuuuuuuw;OOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOO%&wyyuuyywww>>>&3>=&&>3wuuuuutuuuuww66wuuuuuuutywuuttDUuwtw;Au>uwwwuuwww8uyuwwuuuwwwwwww8wwwwuw6;6ww>3dC=d=3CFDwOOO%&&%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"O%%%%%%%%OOOooooooooooooOOOOOOOOooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooo.o@.ooo<4duDu>ywu&uV&e^L+e==>=y*u>ww&&>>>,Oe=CyyOCO3==YDUFf.SS.CSfS2Sh#SP5S@o.@oooOOoOO&oOOO&OO*OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooOOOOooooooooooooooooOOOOOOOO&%yuwu%>8wVAt8wuuuwwww88;xy>>AFeCUD5+Ss.sSshs#s5L.o=>trt,>>>;&%O%%%%%%%%OOOOOOOOOO%%;>wuttuwww>%OOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOO%>uViwwyyuyu>>,>>33>>wwwuuwuuttuwwww88wwwwuuuuuyuwuVuuAt6uw;w->Vuuuuuwwwwuyuwuuuuuwwwwwww8>>wyuw-t>>w>w>w3CTL;%>>>&OO%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OO%%%%%%%OOoooooooooooooOOOOOOOOoooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooo.o@.@@o33w>3>>uyyww;OEE+od==O%%O&%>uuuw>>yw&3O>U=O=o=ed^Fde<C2+22Tf.2@sLg@.foo+o>OOOOOOOO*O=&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooOOOooooooooooooooooOOOOOOOO%Owtww>8%-wxw8tytuuuwwww6yy8wVCe+Uf.@^S$KSXshYY5^52wwxrz>>&%%%%%%%%%%%%%OOOOOOOOO%%%&>wuyyuwww&OOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOO%&wyywwyyuyy>>w>>&=3w,>>wwwwuuuuwwww86wwwwuuuuuuutwyu;6>ww8tuuwuuuuuuuutwtyuuttwtuuwwwww86>>>www6t%>Vw%w%wGAOwVwVVeOoOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOO%%%%%OOOoooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooo.oooooo3>uDww>-u&y,>OYO==edoO3Oww%%>wee3wydD]T=3e>weeSDFC=++<d44d)3YUoo2@oeoOOo%%OO&%O%%%%OO%O>OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooOOOooooooooooooooooOOOOOOOOOO>yu8ttt>6wwututttuuuuut6>uw&O2af.$SE $sX))R KI)2+>&ytZ>>%OOO%%%%%%%%%%OOOOOOOO%%OOO;wyyyuw,>%OOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOO%O&wu,wyywwu>,w>d>=yVu3uw,>8wuuw6www6>68wwutuwww>ywwnVx>ww>y>uwuuuuwutyyuttuuyywytuwwwww>>>-->66t%wy-wy,u>,OuyOweCCe=OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOO%%%%OOOooooooooooooooooooooooooooooooOOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OOOO%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..+oo=SVO>y>>>w,A>*===L+3=3w&>>=33=3edA33eS[)eTDdeS`Ee=2SFefE4C4SF[_LTooooOOOOO%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOO%%>tyw688;t6wn8wuwuytwwu6twu3>eO4SS@h]K_'IK#XIsK`EUe**6%%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO;&&%%OOOOOOOOOOOooooooooooooooooOOooooooooooooOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOO%%%&&>wwuuuww,wuVV3uy33w>>>>8wwuwwwwwwwwwwwwwwwwwwwwww8>6wuuwwwwyyuuuuyyuutyyyuwuttuwwwuw>>6w>>w66>>wtw>>wuw>wyy=4Ee+Oo>OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOO%%OOOOoooooooooooooooooooooooooooooooOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOO&&y%w>>;>w3=VO33=3>wu3>>o==Fde@dVODo=F=D=O2<D334LffYS5+oLoUd@SSoooOOOO%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOO&wu8>6w>668twttwtytttnnxtw>>3+UE5@JKK`[IR[RIhKYSUe^>O;%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOooooooooooooooooOOooooooooooooOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOO%&&&>>,wuuuuuuuu&u333>wuwwwwwwwwwww8www6wwwwwwww8wwwww86>wwwwwwwytuuutyyyyyyyyuwwuuwwwwww8>86>>68>-->666t8>uyyu3oSeo==oOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOoooooooooooooooooooooooooooooooooOOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@@OeDVUT&y>>>wwe=deo@==&O&>&>f2oee2=F3=LV=ee=+f=oU4oS@^U43@DdLfTLCY4oooOOO%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOO>uytw886;ttwttttttttyVywtu,3=@+YE@$s'{{K'}Kf5fR4SDD:>O%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooOooooooooooooooOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOO%&&&>>>>wwuuuuuw3y3;&&w>wwwuuuuwwww8w86>wwwwwwww>6wwww86>6wwwwwwtttyyyyyyyyyytwwwwww88wwwwww6>>wu>;>>6wx6uu>&3u3e2Yf=oOoOOOOOOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOooooooooooooooooooooooooooooooooooOOOOooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&%OO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@oo+oo=S3FUyy86tu>3>=3D=2=>O>y>w+=SfD=aS+de>>ede4oofUf2ff<dFFoS5o4ofYSo2ooOOO%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOO&>tyytr6u6ZZ6ttttttwwutu;uw3e32S52SSE'['KR)$R$@YL4eo3O&%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOO%%%&&;&&uuuuyuw,DFw33wi,>>,wwwuuww88w8>>wwwww866>>6wwww8>>68wwwwuutyyyyyyyttttuwwwww88ww8wuw86wtu>&686tAV>wAd%>DL=Y_o=oOOOOOOO%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOoooo.ooooooooooooooooooooooooooooooOOOooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>&%OOO%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@2433&iDVy-6d33C4C`eo==*wu>-22f4TUD=oeFO3D==f<fLf++5FfE4+SEL52dC`_s.oooOOO%%OOOOOO%%%%%%%%%%OOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooOOOOOOOOO%%OOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooOOoooooo.ooooooooooooooooooooooOOO%>wttw66t8Zx-wuwuttwwwwVyyw3ydae4f)'4hY hsRppfUp4e=&3*O%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOooooooooooooooooooooooooooooooooOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOO%;>>&uuuyyyuuFu%3>;uww>>>6wutww8ww8>>wwwww86>>>68wwww>>>68wwwwuuyyyyyytuuuyyywwwww8ww>www>>wu>%%>>;wZw>>yVdedFo5^2o=oOOOOO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOoooo.ooooooooooooooooooooooooooooooooOooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>;%OOO%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo+eFLUw>UVV-6=3Oe@/De=e=O%;w>+LLf+dCS^UC2wFUSSEPS245Cs4LsL^Jf5SL54^LooooOOO%%OOOOOOOOOO%%%%%%OOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooOOOOOOO%%%OOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooOOOooooo..ooooooooooooooooooooooOOO%&>8ww6ww6w8-6w6wttttttiAVyueC3dSS5S$s5Sgs.L2@f3ad=C=oO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%%%OOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOooooooooooooooooooooooooooooooooOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOO%>w,>wwuyyyVVAeyFd3AFyuw>>8wuw88www6>8wwwww868888wwwww6>>8wwwwwuuyyyyyuwwuyyywuwww8ww>ww>>>>>>&&>>;6t6ww&&edfC5L]ooo@OOOOO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOoooo.oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO&%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo+ooooo3DDw%nwt>AeFeC=)oFCUy>>-At+JDho<+e^L=dF>TCSLSS$LUSa@sh.25.KL$4.)EooooOOOO%OOOOOOOOOO%%%%%%OOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooOOOOOO%%%%OOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooOOOoooo...oooooooooooooooo.ooooooOO%%-6tr8t686wy888utuwtytuDViweLe3d5L4L2f5$s#h)fTL3CCoO=o%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO%%OOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOooooooooooooooooooooooooooooooooOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo%OO%>ww,>wuuwuVA3&>y&Oiiyuww88ww88wwwww68wwwwwwwwwwwwwwwww>>8ww6wwwwuyyxyyuwutyyuuuw868w8ww>>>>>>>>>>>8wA>;Veo2UEh`[LoooOOOOO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOoooo.oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@o+33=3uyut>-Fe=3Co+3+dUddu%x%@4f4<oo3+=d3d=y=fYspKEpsaL2Da22oSsfh.h@oooooOOOOOOOOOOOOOO%%%%%%OOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooOOOOOO%%%%OOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooOOOoooo...oooooooooooooooo..oooooOOOO%;wt8t;tuZDu>wttw8wtuVUu>%eELaf4E[f2fS44$+_LL3edO3=o=%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOooooooooooooooooooooooooooooooooOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo%OO%&>,>>www>wyAd33u>yGDuwwwwwww66wwuuww6wwwuwwwwwwwwwwwuw668ww6wwwwwtyxnyuwuuyyuuuw6>>68ww>6ww6=>>&;8ww%ww==32@a@2E)3o@OOOOO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%%%%%%%%%OOOOOOOOOOOOOOOO",
+"--%%%OOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooOOOOOOOOOOOOOOOOoooooooooooooooo.o.@oVFtwttuu==3wVyuTA;i&y>,Ai,,y%;;==eEDF53=e%VeewFdSLFfSSP.$fho4f=TYOOOO%%%%%%OOOOOOOOOOOOOOOOooooooooOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOoOOO%dSFu>uw,yuuu>,VFAu>eATVeDw&dOdf^ea=DDYS2Sg.@S.L=O>OOOOOOOOOOOOoooooOOOOOoooOOOO%%%%%OOOOOOOOOOOOOoooooooooooooooooo.ooooooooooooOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOooooooOooooooooOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooo..oooooooooooooooo@+o=ew;>8wwwyxruuwwwuyu%u>8;tr86>>8wwuwwwwwww6888wwwut86>>686;twwwuttyyxxxyttxttwww86>8,>>>>,w>-ww;6u>>>>uu%%yC==3UeOOOOOOOOOOOOOOOOOOO%%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%OOOOOOOO",
+"--%%%OOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooOOOOOOOOOOOOOOOOoooooooooooooooo...=>DDVwtw8,==dyADVFAVOwy,>uw>,--8u==+SF+<OeeeOTFww4offCfhff44fF2o_Y2O=OOO%%%%%OOOOOOOOOOOOOOOOooooooooOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOoOOOOwVC6w>ww>y;yyADFVyV&Oyw&LTdO3Oe<eSdLDS2YL.p5$T_@OO%OOOOOOOOOOOoooooOOOOooooOOOO%%%%OOOOOOOOOOOOOOoooooooooooooooooo.oooooooooooooOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOooooooOooooooooOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooo..oooooooooooooooooooCD3uw&>wyuw8wtuwwwuDdiDUtw86688wwwwwwwwwwww8wwwwwww86>>6wwwtttytuw8xytyyyyytuwwwwww>>>>>>>>>>>>;>6->wuyy>%wd=OCLeo=OOOOOOOOOOOOOOOOOO%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"-%%%%OOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooOOOOOOOOOOOOOOOOoooooooooooooooo...@OVVrvxw6,3eCDu,;>%wV>,,,,wwiAt>&&dCL4@SF3&FUw3&SC<FS44f5pYRp4oFToO=oOOO%%%%%OOOOOOOOOOOOOOOOooooooooOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOO%,e>>wyyVAV,uVVyw,uwyeVO=D==3_SL3ELSFooLS.5.WEfO*O&OOOOOOOOOOOoooooOOOOooooOOOOO%%%OOOOOOOOOOOOOooooooooooooooooooooooooooooooooooOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOooooooOooooooooOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooo..ooooooooooooooooooodF>www>>;>6>8wuww3>Cy;yD>;888wwwwwwwwwwwwww88www86688668wtxwtyxxyytxtutyxxytwwwwuuu>>>>>;&&>8>;ww>;%&%&,>>uy33SDeo3OOOOOOOOOOOOOOOOOO%%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"%%%%%OOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooo..ooo,>wxntwwweCDTDwVVwiw,ie>=>3n&O&dSSd=@ef@eVF,CeCd+SSeh<hSQEY44Too=o&OOO%%%%%OOOOOOOOOOOOOOOOooooooOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOO,DtUVuD6Vywwyyuw>OuOud&CS=eDLY2LoDD==+fLpEL+ooOO%OOOOOOOOOOOoooooOOOOooooOOOOO%%%OOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooo..ooooooooooooooooo@oo=e3wuw>;>6;>>33>==333>>>wywww8wwwuuwww6688668ww8668www8wtx8wwwwtnVttuwtxxxttwwwttt>>>>>&&;;w>;yywwVVy,w,>>==e=3oOoooooooooOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"%%%%OOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.o=wFyZxxtwu,>uwDi;uy&,3=iw&=<dCO==Fedo+eeidUiOedi3C=HD5fLEfY[)C^d+2Oo&OOO%%%%%OOOOOOOOOOOOOOOOoooOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooO+ooOOOO%DuGy>A%uyw>wyyw>DVOOew3yd3oe2So3o+o4.SW)].o3O>OOOOOOOOOOOOOoooooOOOOoooooOOOO%%%OOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooo..ooooooooooooooooo=+oOCyw>wVVu;&&&;>====Ode&uw>uw8>6wuyytuw8666>68wwww8wwttw88w8ww66wuwwttwwtxnxtuwutuu6>>>;>,w;w>>yywu%,w3yVCF33Cd3O=OooooooooOOOOOOOOOOO%%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"%%%OOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo=FTAVxxrtyw;>A>,A>>yCe=e=@34DLe3+3@C4oOeeSe=idC=DFC<4<Sf<D^]SS)o@Oo=oOOOO%%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%ooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooO@ooOOOOO8www>wyw>>>6>;>8e*w=Odd33Co+3o4=O342+2.)L+=oo>OOOOOOOOOOOOOoooooOOOooooooOOOO%%%OOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooo..oooooooooooooooooo@OO3w3>wyiu>;&&&====4@=3=u>&uw868wtynxytuwww68wwwuwwwwtuw866;8wwtxywwtt86uxnxyttttww>>>;>>wy;8>>uuw>yVe=*&3d==eLOoooooooooooOOOOOOOOOOOOO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooo",
+"%%%OOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOCTVuxt8wVy>>wyFD&uy=DCd=<4<Hfe24<4C=FOeFD3eH&3OCeLeL3+C42+D+DCoO=o%3OOOOO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%ooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOooOOOOOO>w>u>-u%>wtw6>8tOOVV3w3=CdeCfD3o=ed2d44Yooo=oO,OOOOOOOOOOOOoooooOOOooooooOOOOO%%OOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooo..ooooooooooooooo=ooO+oo=3eew>wy3>=====+FU==33yuwwwwwuyyyyyyyyuuwwwuuuuuwwwwwww6;>8wyZVtuyu>>uyyttttttwwww,>>>3w--6w>ww>ude3>2dD4=eU=+O+ooooooooOOOOOOOOOOOOOOO%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooo",
+"%OOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@owUynyw->yyw>*wwVu3eTCid2fSfEff+f2LD@44SHO<,3wiUOd<wdd34<SL=@o=oOo=OoOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%ooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooO+OooOOOOww>u86>866>>6>>w>dDeOCe=3Se2eoo=322f_@@ooOo3OOOOOOOOOOOOOoooooOOooooooooOOOO%%OOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooo..ooooooooooooooo@oo+@o=eeeeuuuyw33>2=+@S_f=3Ow&>>wuuuuuyyyyyyyutuuuuuuuw6>>wuuwww>-wxywtyw>>yxuttttttwwtuuw>&&&%%>w>wy>O3dCd23C=oeCoo=oooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooo",
+"OOOooooo...ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@3Vyyit>>>V&w*OAud3=3))Hf4SS^PL5fSh4ed<C^O=<3=Vi,CdA&3d==F344OOOOOOOOOOOOOOOOooooooooooooooooOOOOOOOOOOOO%%%%ooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOO%OAiw&w;wwwww866>=>>&>eyoeedo=a<=+<=+fCooooOOOO%OOOOOOOOOOOoooooOOOooooooooOO%%%OOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOoooooooooooooooo..ooooooooooooooOOoooo@@5o==uu&yu>dD===@4FY3>%3&,wwwwwwwwwuuyuuuwwwwwwwwuwwwwwwwwww>xFu>y;%>wyywwwuuwww8uwuw>3uw>u&u%uA3w==fdL3<3oLfo=o@oooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooo",
+"OOOoooo.....ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo4oo4CdVuwDu/)u&OuD;Oo3<^]LLLfSLKg)`oLf4+CUD<d33VVu=yyDCeVDCdo3OOOOOOOOOOOOOOOOOooooooooooooooooooooOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOO%wVFFw>w,wyu6>8>3ee=>ed@3=2a3ad3DS2+oooooOOOOOOOOOOOOOOOOOoooooOOOooooooooOOO%%OOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOoooooooooooooooo..ooooooooooooooOOoooo@@2S3eeeVwA&3De@+3=eL=>%3;>,wwwww,wwwwwww3;;&&&&;;>>>,,>>>wwywuywuy>>wwuuw>8utwwwuuwuw>wyu-wAi>3e=d2o=S<o+o4Dd++ooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooOOOOOOOO",
+"OOoooo......oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.@o2SDCdeVOODUA;i&%O33DFDfLSsL2JWSW)YY.dCS==dOe&du33w3d3eVD^u%OOOOOOOOOOOOOOOOOOoooooooooooooooooooooooOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOO@@o=SD==w&;w8-;w=%=>&=3==e==D=+d4Ce@=@o+OOOOOOOOOOOOOOOOOOOoooooOOoooooooooOOO%%OOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOoooooooooooooooo..ooooooooooooooOOOooooof{T4Vwu,y>wue===@=C=3&>;>>www3>;>>>>>;&&%%%OO%%%%&>,w>>&>>uwww%w,&&wwuyywyVxu8wtw,w>%>w>&>uwdeF=o+2o424++LeoooO=oooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooOOOOOOOO",
+"Oooooo.......oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.oo@o4ddd3ee3yOww&wyV=SFSEhYYp5gPss5S#4Fe3^i=C<=ewydyee*V3u/w>O%OOOOOOOOOOOOOOOOooooooooooooooooooooooooooOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOO+o@off3==&&&&&>uy>%>3ewOeCeeLd3eS<oOo+=oOOOOOOOOOOOOOOOOOOOooooooooooooooooOOO%%OOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..ooooooooooooooOOOoooo.2{Loe3wVwww%y3=@==d=3&&>;>>>>>&%&&&%%OOO%OOOOOO%O%&>>>>;>%&;w>Owy>>>>>w>txVntwwtw>>&O&>&wyO>AVUC<L4+SY.o=D<@<oooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"ooooo........oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.@@.SELf2dfoedo=>ww3=3S3f4SLSLSLkWgs$ff4de^C<F<d>3w33ViwD&>;>OO%OOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOO+.@+o234=>>&&>3>V3&>wye=ee=34deof+O+oo@oOOOOOOOOOOOOOOOOOOOooooooooooooooooOOOO%OOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..ooooooooooooooOOOOoo..s(f5@=>&ywwwA&O33&u;>&->&&&&%%%%OOOOOOOO%%%%%%%%O%%&&;>>>%&%;>>Fi>&;;,ww>6wwtttyuww>%&>%>u>3>dCF2LSo@_R$d4@@+oooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"oooo.........oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...+`_LL54+Y[DO3y*Ow=df=CLLfSPSPIW`}5$pSLY<wd&eC%ww&>Vwwu,>O%OOOOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.$S^DL5o+=3>>>=&>===O%>==3eDCT(^o+oo=Oo=OOOOOOOOOOOOOOOOOOOooooooooooooooooOOOO%OOOOOOooooooooooooooooooooooooooOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo........oooooooooooooooooooooooooooooooo..oooooooooooooo%OOOoooo.YUf<FVywtu,y>O>>*3&&;-6*%OOOOOOOOOOOOOO%OOOOOO%OOOOO%&&&&>&%;yUV3;>>wuw>>6wwtuwuww,&>>%>%Vw>Dod3+2o@4P}Fooooo@@ooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"oooo.........oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.5^hQ)@2faEE333%yTee@=ShhssSIKIKQW^h@D5UTeeCdC3CViAD>Vuw*%OuO%OOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo+@#ffLff4==33=>e&=wwOO33e==C=odfo=oo=OoOOOOOOOOOOOOOOOOOOOOoooooooooooooooooOOO%OOOOOOooooooooooooooooooooooooooOOooooooooooooo.oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo........oooooooooooooooo..................oooooooooooooo%%OOoo@@f^Ee+d&;;xw-%w>O>&w;->->OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%&>w&;,wDDVyu>%%O6wwww88ww>ww>33%y>VuFU3fJdLS..E^+oo=+oooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"oooo.........oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooX.@4PS[)@+2^d44dy**FOLFCD5p4hghYQkj$KLK<==SVedUFwVuyAD&DU%*O*OO-OOOOOOOOOOOOOooooooooooooooooooo....oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@.+.EREYF2@ee=yL%%>3&=>=Ed3DU<+o@o@+oo>%OOOOOOOOOOOOOOOOOOOoooooooooooooooooOOOOOOOOOOooooooooooooooooooooooooooOOOoooooooooooo.oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo........oooooooooooooooo..................oooooooooooooo%%OOo@@@WLS4=edytw-w&,&>>>u>-6%;OOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%>&>;uuOOu,wu>>3,%;886>6wwwuuwuu>%y>&d=CfSLJL^)] o=oooo+oooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%%%%",
+"................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOoooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@o@@@2YDO3wVu%8-==%O,VVuFFdi44SYRKKRhSPJfff+f4<fS2d4C=yu&&%OOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...2{{U2LL4df+SEUDVe+=Yh]U.@5@oooooooooooooooooo%%%OOOoooooooooooooooooooooooOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo............oooooooooooooooooOOOoO3d<ee<<idew,&&%%%OO=43+ooOooooooooooooooooOOOOOOOOOOOOOOOO%%&,=O<d2ed+5+22y=eCD>>wuwy>wu%y>eCC>FFCooa.){R @@ooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOOOOOoO%OO%O%%OOOOOOOOO",
+"................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOoooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@+eeS^S3wyuww>6O==%&wyy=CCFdYffJKhgSJIE{L@fESSLSffeeFF>&%%OOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@.@+LUYS2f+4f5SUyw3>OoS++@oo@oo@oooooooooooooooo%%%OOooooooooooooooooooooooooOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo............oooooooooooooooooOOOoO=3=ede<=+o,=&OOOOOO===@oooooooooooooooooooOOOOOOOOOOOOOOOOO>w>OO3e=o5Sof5LE>ODT3OwOuwyuyAD>O3ey3y3e2@sRW X@oooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOO*%OOooO&O%%OO*OOOOOOOOO",
+"................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOoooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@o<<3^L3=3>OVTDV&=,=&>weDCDeS@pfShILppPR{{)f2oe__ELTSF3O%%%OOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@.oo..D4@f+@2@+oO%OO@o2..+2@o@oooooooooooooooooo%%%OOooooooooooooooooooooooooOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.............ooooooooooooooooOOOoooO@33=O+4d=&OOOOoo+OooooooooooooooooooooooOOOOOOOOOOOOOOOOO,e=oO=32F_Lo2@fw>>OudV>V>&Fy&>FUV3CCdVAOSCJEY$ ooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOO%OO=OoO%OO%OO%OOOOOOOOO",
+"................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo=o223EoOe33yAywUe,=>,>>>UD=LTfhfgggsPLSJR`[^C.oS)SeYC3O%%OOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo....<.+oo2ooooooO=OO@o+o$o..oooooooooooooooooooo%%%OOooooooooooooooooooooooooOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................oooooooooooooooooooooooo+dH=@OoooooOooooooooooooo..ooooooooooooooooooooooooo=<Ooo+=oY[4S3=<>wy&>;uuV>u%&dy=>eATud*LDdCfS. XooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOO*ee&OOoOOOOOoOOOOOOOO",
+"................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooof2FYe@==DA>>&,w3=&>>>&&edeiShs$$hLhLh4SJ4L+L2o+@oo+oO=OOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.@+.+@ooo@oo@o@+O=oooooo...oooo+oooooooooooooooo%%OOOooooooooooooooooooooooooOOOooooooooooooooooooooooooooooooooooooooooooooo...oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..................oooooooooooooooooooooo@2@Oooooooooooooooooooo...ooooooooooooooooooooooooOooOOoO=OdUOCe<eA6>,i>wwD>=3C=Ce3>iF%DwT_3@<g@o.oooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOO%%%%%OOOOOO%we3e3ooOOOOoOOOOOOO%",
+"................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo....ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@4f^+=3eA>3y;>&&>33>&>,VCE=4ffDf2hffSf5fLLfSfo=o@2ooo=oOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.2..oo+@oo@@oooo&oOoooo.@+@oooooooooooooooooooo%OOOoooooooooooooooooooooooooOOOoooooooooooooooooooooooooooooooooooooooooooo....ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.........................oooooooooooooooo@oooooo...oo...ooooo....oooooooooooooooooooooooo@oo@+oO=3O%=&&w&->>O,iV%3Dd3d3Y5u>VwyFO%yOCfo+o.ooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOO%%%%%OOOOOOOO%wSF2oooOOOOOOO%%%%",
+"................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.....oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@@2odfD3O=&DDwO>wO=3uw,ww>uyeFfY4f2ff@aS5LSfSEoo2oo+=o=oo=OOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................ooooooooooooooooooooooooooooooooo.o@.o@ooooooooooOo+o@ooooooo@@oooooooooooooooooOOOOoooooooooooooooooooooooooOOOooooooooooooooooooooooooooooooooooooooooooo.....oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo........................ooooo...oo...o@+oo..oo..........................................ooooooO+OO,,O%i;t6uwy>wwO3=fSCDLLUUu>%>Vw&edo@.+ooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOO%%%%%OOOO%OOOo=CF2ooooOOOOO%%%%%",
+"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo......ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@@5ffEoo>3w=de3w=eww,>wy,OiDeDLfh@Yhf5<Ld4425dD4^eo@oo=ooOoOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................oooooooooooooooooooooooooooooooo.+.o@.oo+o@oo@ooOoo+o@ooooooooo@ooooooooooooooooOOOooooooooooooooooooooooooooOOOoooooooooooooooooooooooooooooooooooooooooo......ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.........................oo.....@@...o.o................................................o@oooOoOOO&O8;ny6uuV,uee+ddfT+SFU&>,uyuwu3@+o.@ooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOO%%%%%OOO%OOO=Oo&s+o+@oooOOO%%%%%",
+"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......oooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@oo=ooY`oEfOO=>&O=OOe=+%>>>,w>ODDeddYU5L2<4YEdSf54SfdLfOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...................oooooooooooooooooooooooooooooooo..ooooooooooooooooooooooooooooooooooooooooooooooOOoooooooooooooooooooooooooooOOOooooooooooooooooooooooooooooooooooooooooo.......oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.........................................................................................oooooo&%O%wu8ww%yV=3eoFY5fsf53ww>%&>>yeUo=o@oooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOO%%%%%OOOOO&OoO=O)_.+@@o=OOOO%%%%",
+"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo........................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo=@=YUL4oO3uywD^C2o@=>,,;;88>;weCiSLhdCF2TSoFfF4S+ET+OOOOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo....................................oooooooooooooooo..ooooooooooooooooooooooooooooooooooooooooooooooOooooooo.ooooooooooooooooooooOOOoooooooooooooooooooooooooooooooooooooooo........................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..................ooo....................................................................oooooOOOO%,yuA&;weS2efJofha4O%>&>%&&w>Do+oooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOO%%%%%OOO%OOOOOOoY`@d4oOooOOOOOO%",
+"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.........................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@=5L.^Fe>O&yyU)Eee=2www>&&;;i%,CCSLfddeC=fDYD4dfe5foOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.....................................oooooooooooooooo..oooooooooooooo.oooooooooooooooooooooooooooooooooooooo..ooooooooooooooooooooOOOooooooooooooooooooooooooooooooooooooooo.........................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...............ooooo.....................................................................oooooo=&OwDFeO33=C4SYaTL+of2O=O3O&&=Oeoo@ooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOO%%%%%OOO*OOOOOOO.hSSff++OOOOOOOO",
+"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..........................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@o@oo+2d4LD23&;>&O&d42aS>>,8>&&;u&FLSiLSeL3CeSCDoCLD)oooOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo......................................oooooooooooooooo..oooooooooooooo...ooooooooooooooooooooooooooooooooooo....oooooooooooooooooooOOOoooooooooooooooooooooooooooooooooooooo..........................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...........oooooooooooooooooooooooo.......................................................oooo==O3FTe3C3o@=CCC]{]5.=oeeD33%%oOoo@.oooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOO%%%%%OOOO%%OOOO3<o)LfT33=@oO%&OO",
+"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...........................................................................ooooooooooooooooooooooooooooooooooooo..oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@oo+==aaFO3>,6y&,d^@Sf;&&,888u;%dFiOfdwCd3UdS4L23_Eo2oOOOooooo..ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......................................oooooooooooooooo..oooooooooooooo...oooooOOOoooooooooooooooooooooooooo.....oooooooooooooooooooOOOooooooooooooooooooooooooooooooooooooo...........................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.....ooooooooooooooooooooooooooo........................................................o.ooooo=2oCd3DSSfo_S)_eY_TL3eo==OooOoo.@oooooooooooooooo..ooooooooooooooooooooooOOOOOOOO%%%%%OOOO&OOOOoOo=UCSLJC2==OOOoo",
+"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo............................................................................oooooooooooooooooooooooooooooooooooo....oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@oo+@@+Lf2&%%;OF%=)eo+V,%&>>>8u;OO<dLHeeVVDVL3DTo4@o@oOOOoooo....ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo........................................oooooooooooooooo..oooooooooooooo...ooooOOOOoooooooooooooooooooooooooo.....oooooooooooooooooooOOOoooooooooooooooooooooooooooooooooooo............................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.oooooooooooooooooooooooooooooooooo......................................................o...oo.@@S2of52dSS2L2LCf2<o=oooOoo@o..@oooooooooooooooo....ooooooooooooooooooooOOOOOOOO%%%%%OOOO&OO=%oOoFd+D2@o3ee2ooo+",
+"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo............................................................................oooooooooooooooooooo....................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@oo@o+ST2@Ow;%TuVEDE_YGi;>w6-&%Vu=<D^^OUyVDFo+=3o@oo@@OOOooo......oooooooooooooooooooooooooooooooooooooooooooooooooooo................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo........................................oooooooooooooooo..oooooooooooooo....oooOOOOoooooooooooooooooooooooooo.....oooooooooooooooooooOOOoooooooooooooooooooooooooooooooooooo............................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo........................................................@@o..@@@@o@=oooo+@=+ooooo+=Ooooo.o.oooooooooooooooo....ooooooooooooooooooooOOOOOOOO%%%%%OOOO%OO=O>U@=e@Ddo33ee2ooo+",
+"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo............................................................................oooooooooooooooooooo....................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@oooooo+<dCC&>>8y>VddSfSUAwyAnw>&DwO=Cdo&wOO>>o==o=+o@@oOOOooo......oooooooooooooooooooooooooooooooooooooooooooooooooooo................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo........................................oooooooooooooooo..oooooooooooooo....oooOOOOooooooooooooooooooooooooo......oooooooooooooooooooOOOoooooooooooooooooooooooooooooooooooo............................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..........................................................@+.o+.oooo@=o@2oooooooooOooo@.@.oooooooooooooooo....ooooooooooooooooooooOOOOOOOO%%%%%OOOOOO=%oA`DOd3=O<=3=@ooooo",
+"oooooooooooo....................oooooooooooooooo.....................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@oo@@od4dF3o=O=%&>uw>;;>wwwuyuwwO>w;VF=%%OOOOOOOOOOOOOO.....................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooo.......................................................oooooooooooooooo................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...........................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......oooooooooooooooo...................................................................oooOO%OO%&OooOOOOooOoooooooooooooooooooooooooooooooooooooooooooooo..oooooOOOOoOOO%%%%-O%Ooo2Ls22g+@FYoOOOOOOO",
+"ooooooooooooooooooo.............oooooooooooooooo.....................................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo++@FCa+o=DdOLAw>>;6twuw>6u>OAww>&eyO%%OOOOOOOOOOOOOO.....................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooo.......................................................oooooooooooooooo................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...........................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......oooooooooooooooo...................................................................oooOOO%%Ooo=2OooOO==Oooooooooooooooooooooooooooooooooooooooooooooo..oooooOOOOOOOOO%%%%O=oOooo.LCo22J+oOOOOOOO",
+"oooooooooooooooooooooo..o.......oooooooooooooooo......................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@@+o@oofUd=2dC3=Dy&;>668wwwwwwwwyu>&3ywO%%%OOOOOOOOOOOOO......................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooo.......................................................oooooooooooooooo................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...........................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......oooooooooooooooo....................................................................oooOOOOOOOooOoOOooooooooooooooooooooooooooooooooooooooooooooooooo..oooooOOOOOOOOO%OO%OOoO<+@+ofEsdoooOOOOOOO",
+"oooooooooooooooooooooooooooo....oooooooooooooooo......................................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOO=STe+=2&&C>&%;8w6->;wVy;uD%>;>VAw*%%%%OOOOOOOOOOOO......................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooo.......................................................oooooooooooooooo................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...........................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......oooooooooooooooo....................................................................ooooOOo+==@oOOO&OO=+ooooooooooooooooooooooooooooooooooooooooooooo..oooooOOOOOOOOO%%%%&OOoooo@@SL@+oeooOOOOOO",
+"OOOOOOoooooooooooooooooooooooooooooooooooooooooo.......................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo+3DC==eDD3O%wu>-ww>;;8uw>wVO>>,AV>O%%%%OOOOOOOOOOOO.......................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooo.......................................................oooooooooooooooo................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...........................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......oooooooooooooooo................................................................ ....ooooo+2==fYCe33=+Ooooooooooooooooooooooooooooooooooooooooooooooo..oooooOOOOOOOOO%%%%O>wd=+@._TFd+ooooOOOOOO",
+"OOOOOOOOOooooooooooooooooooooooooooooooooooooooo........................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo+o@oo=<dTeoOdFu;Ouy>%68;%>;O;VyOO&OOw3OO%%%%OOOOOOOOOOOO........................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooo.......................................................oooooooooooooooo................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...........................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......oooooooooooooooo................................................................   ....ooo@<<<fLTTTLe@++ooooooooooooooooooooooooooooooooooooooooooooo..oooooOOOOOOOOO%%&>Ou3TfLfD)df@oo2ooOOOOOO",
+"OOOOOOOOOOOOoooooooooooooooooooo.........................................................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooeeeS=O>w&O%O&>>;;-%%>-O>VyOOOOOOOOO%%%%OOOOOOOOOOOO.........................................................................................oooooooooooooooooooooooooooooooooooooooooooooooo.......................................................................................oooooooooooooooo................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...........................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......................................................................................    ....ooo@242o3dFdooo=ooooooooooooooooooooooooooooooooooooooooooooo..oooooOOOOOOOO%%&&y=3OS3S3oo=o@oOOoooOOOOO",
+"OOOOOOOOOOOOOOOOOOoooooooooooooo..........................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo@o=ooe3OO>dw>uwuy;O-;%%>;;>6w>>;%&%OOOOO%%%%%OOOOOOOoooo..........................................................................................ooooooooooooooooooooooooooooooooooooooooooooooo.......................................................................................oooooooooooooooo................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...........................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......................................................................................     ....@@.+fdo+o+<=<+oooooooooooooooooooooooooooooooooooooooooooooo..oooooOOOOOOOO%%==3d==OO3oo=o@ooOooooOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOooooooooo...........................................................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo=OOiAOO>w>&&;w&>886>;---%>wyV>&&&%%OOO%%%%%OOOOooooooo...........................................................................................oooooooooooooooooooooooooooooooooooooooooooooo.......................................................................................oooooooooooooooo................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...........................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......................................................................................    ....o..o@++@O++o33o+ooooooooooooooooooooooooooooooooooooooooooooo..oooooOOOOO%O%OOyye==3==4ooooOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOooooooooooo............................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................ooooooooooooooooooooooooooooooooooooooooOoOO%VA&>yiyyu>,;>>>>>-%>>wx>&AD&&%%%OOO%%%%%OOOOooooooo............................................................................................ooooooooooooooooooooooooooooooooooooooooooooo.......................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooo...........................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......................................................................................     .......@+@@@+YT2o+oooooooooooooooooooooooooooooooooooooooooooooo..oooooOO%OO%O&O&deo2ee4&oOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOooooooooooooo..............................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................oooooooooooooooooooooooooooooooooooooooo@oO%&yn%wVVVAV>&>>>66>>;>uyw>FTA%%%%%OOO%%%%%OOOoooooooo..............................................................................................ooooooooooooooooooooooooooooooooooooooooooo.......................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooo...........................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...................................................................................................o@@O=oLUoo2oooooooooooooooooooooooooooooooooooooooooooooo..oooooOO%%%%O&*&w=d33OO>oOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOooooooooooooooooooo................................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................oooooooooooooooooooooooooooooooo.ooooooo&OO%&>>OwxVVZx>-;;>8wwwwwuw>wDU%%OOOOOOO%%%%%OOOoooooooo................................................................................................ooooooooooooooooooooooooooooooooooooooooo.......................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooo...........................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...................................................................................................oooO@o@oo@ooooooooooooooooooooooooooooooooooooooooooooooo..o.ooooOO%%%O;%O=Oo=^^=oOOOOOOOOOOOOOOOOOO",
+"OOOOOOOOOOoooooooooooooooooo....................................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................oooooooooooooooooooooooooooooooo..ooooooOOO%%%%%tVVyyu68>-;8wwwuy>>yw&wOOOOOOOOO%%%%%OOOoooooo..................................................................................................ooooooooooooooooooooooooooooooooooooooooo.......................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooo...........................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..................................................................................................ooooOo+@o+@o+oooooo..ooooooooooooooooooooooooooooooooooooo..o.ooooOOO%%%3=O33J+Sdo>3OOOOOOOOOOOOOOOOO",
+"OOOOOOOOoooooooooooooooo........................................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................oooooooooooooooooooooooooooooooo..oooooooO%%%%%-xAZtw8>w>;;>6>>wuw>w>O&%%OOOOOOO%%%%%OOOooooo...................................................................................................ooooooooooooooooooooooooooooooooooooooooo.......................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooo...........................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..................................................................................................oooOOoo+o@@oooooo....ooooooooooooooooooooooooooooooooooooo..o.ooOoOO%%%&uw3df3o@oo=OOOOOOOOOOOOOOOOOO",
+"OOOOOOOoooooooooooooooo.........................................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................oooooooooooooooooooooooooooooooo..oooooooO%O&-->yZZtw86w8;->>&>w8V;%>ww%%%%%OOOO%%%%%OOOoooo....................................................................................................ooooooooooooooooooooooooooooooooooooooooo.......................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooo...........................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......................................................................................oo........ooooOO@oooo@oooooo....................ooooooooooooooooooooo..o.o@OOO&>8;-uw3ddo@+O=%O;OOOOOOOOOOOOOOOO",
+"OOOOOOoooooooooooooooo..........................................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................oooooooooooooooooooooooooooooooo..ooooooO&OO&;--tZVyxtwu8;-6,>>uwV->t%O%%%%%%OOO%%%%%OOOoooo....................................................................................................ooooooooooooooooooooooooooooooooooooooooo.......................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooo...........................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......................................................................................oo........ooooOOoo@oooo@oooo....................ooooooooooooooooooooo..o.o@+O&>wn8%w>=3<=oo@oO>OOOOOOOOOOOOOOOOO",
+"...........ooooo................................................................................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......................................ooooooooooooooooooooooooooooooooooooooooOOO%%&8ynAAw-&>w>3%&w>>>>%O%&&%%OOOOOOOO%%%OOOOoooo................ooooo................................................................................................oooooooooooooooooooooooooooooooo...........................................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...................................oooooooo.... oooooooooooooooooooooooooooooooooooooooooooooooo.....ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................................................................................................OOOoooooooooooo.ooooo..............................ooooo@ooo,3OdeD4=dCd=OOOOOOOOOOOOOOooooo.....",
+"............oooo................................................................................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......................................ooooooooooooooooooooooooooooooooooooooooOOOO%%&>ADDVwwuuw&wAyCwFV&O%%OOOOOOOOOOO%%%OOOOoooo..................ooo................................................................................................oooooooooooooooooooooooooooooooo...........................................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..................................ooooooooo.....oooooooooooooooooooooooooooooooooooooooooooooooo.....ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................................................................................................OOooooooooooooo.ooooo..............................ooooooo+<e3&3o===ddOOOOOOOOOOOOOOOOoooooo....",
+"................................................................................................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......................................ooooooooooooooooooooooooooooooooooooooooOO%&%%%&tVVywww,y&VDOue^D%O&%OOOOOOOOOOO%%%OOOOOooo.....................................................................................................................oooooooooooooooooooooooooooooooo...........................................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................................oooooooooooo....oooooooooooooooooooooooooooooooooooooooooooooooo......oooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................................................................................................Ooooooooooooooooooooo..............................ooooooO@=OO&OC==eDDooOOOOOOOOOOOOOOoooooooooo",
+"oooo............................................................................................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......................................ooooooooooooooooooooooooooooooooooooooooOO&&&&;>;6w>>>>&%>U/u=OyVOO>%O%OOOOOOOOO%%%OOOOOoooo....................................................................................................................oooooooooooooooooooooooooooooooo...........................................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.........................oooooooooooooooooooo...oooooooooooooooooooooooooooooooooooooooooooooooo......oooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................................................................................................ooooooooooooooooooooo..............................oooooo@o+O,DSdedde=o=OOOOOOOOOOOOOOOooooooooo",
+"oooooo..........................................................................................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......................................oooooooooooooooo...oooooooooooooooooooooOOOO%;8wwuuw>>>>&O&y>yDD>OO%O%&OOOOOOOOO%%%OOOOOooooo...................................................................................................................oooooooooooooooooooooooooooooooo...........................................................................................................ooooooooooooooooooooo................................oooooooooooooooo.....................ooooooooooooooooOOOOooooo..oooooooooooooooooooooooooooooooooooooooooooooooo.......ooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................oooooooooooooooo................................................................ooooooooooooooooooooo..............................oooooo@ooo<HSo3==Ooo%OOOOOOOOOOOOOOOOOooooooo",
+"ooooooo.......  ..............................................................................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......................................oooooooooooooooo....ooooooooooooooooooooOOOO%,ty>>>>;&>>w>>>>>d=%&%OO%%%OOOOOOOO%%%OOOOOoooooo..................................................................................................................oooooooooooooooooooooooooooooooo...........................................................................................................ooooooooooooooooooooo................................oooooooooooooooo................ooooooooooooooooOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooooooooooo........oooooooooooooooooooooooooooooooooooooooooooooooooooooooo................oooooooooooooooo................................................................ooooooooooooooooooooo..............................oooooo@Oooo&oO&oo=O3oOOOOOOOOOOOOOOOOOOOOOOOO",
+"ooooooo.....    ............................................................................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo............................................................oooooooooooooooooooO%%O%8ty%%--%%&>O&>>%3=>&w%O>&O&OOOOOOOO%%OOOOOOoooooooo................................................................................................................oooooooooooooooooooooooooooooooo...........................................................................................................ooooo................................................................................ooooooooooooooooOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooo.........................ooooooooooooooooooooooooooooooooooooooooooooooooooooooo................oooooooooooooooo................................................................ooooooooooooooooooooo..............................ooooooo@O&=OOoOO&ooOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"ooooooo.....    ...........................................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.............................................................oooooooooooooooooooOOOO;8w8wuw>&&>w&%%OVOe>w&>AwO>OOOOOOOO%%OOOOOOoooooooo................................................................................................................oooooooooooooooooooooooooooooooo...........................................................................................................ooooo................................................................................oooooooooooooooOOOOO%%%%%OOOOOoooooooooooooooooooooooooooooooooo..........................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..............................ooooo@oOoO&o&=oOOo&oOOOOOOOOOOOOOOOOOOOOO%%%%",
+"ooooooo.....    ..........................................................................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..............................................................ooooooooo...ooooooOO&%O&O;>>>;%&>;O;w>>w>,,,>>&%%OOOOOOOOOOOOOOOOoooooooooooo............................................................................................................oooooooooooooooooooooooooooooooo...........................................................................................................ooooo................................................................................oooooooooooooOOOOO%%O%%%%OOOOOoooooooooooooooooooooooooooooooooo...........................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..............................oooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%",
+"ooooooo.....    .........................................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...............................................................oooooooo...oooooOOO&O%w>->6>-%&>y&%>&>3=&&&&%%OOOOOOOOOOOOOOOOOOOooooooooooooo..........................................................................................................................oooooooooooooooo...........................................................................................................ooooo................................................................................oooooooooooooOOOOOO%%%%%%%OOOOOooooooooooooooooo............................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..............................oooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"ooooooo.......  ........................................................................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................................................................ooooooo...oooooOOO%O&ny%>6>-%&>u>>w>>>*%%%OOOOOOOOOOOOOOOOOOOOOOOooooooooooooo.o.......................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooo...........................................................................ooooo................................................................................oooooooooooooooOOOO%%-%O%%OOOooooooooooooooooooo..............................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..............................oooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
+"oooooo.................................................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.................................................................oooooo...oooooOOO%%>VV%>>>-&>>;>w3&%=>%%OOOOO%OOOOOOOOOOOOOOOOOOOoooooOOooooooooo.....................oooooooooooooooo................................................................................oooooooooooooooooooooooooooooooooooooooooooooooo...........................................................................ooooo................................................................................ooooooooooooooooOOO&>6>--%OOoooooooooooooooooooo................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..............................oooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooo",
+"oooo..................................................................................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..................................................................ooooo...oooooOOO%%>Vi-;;-->>&&&%O%=3u%%%OO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooo...oooooooooooooooooooooooooooooooo................................................................................oooooooooooooooooooooooooooooooooooooooooooooooo...........................................................................ooooo................................................................................ooooooooooooooooOOO>uyyu&%OOoooooooooooooooooooo................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..............................oooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOooooooooo",
+"......................................................................................................................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...................................................................oooo...ooooooOO%%>nu%;;%%;;%%&%;yd3=%%OOOO%%OOOOOOOOOOOOOOOOOOOOOOOO%%OOOOOooooooooooooooooooooooooooooooooooooooooo................................................................................oooooooooooooooooooooooooooooooooooooooooooooooo...........................................................................ooooo................................................................................ooooooooooooooooOOO&>,>>%%OOoooooooooooooooooooo................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..............................oooooooooOOOOOOOOOOOOOOOOOOOO%OOOOOoooooooooo",
+"............oooo.....................................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...................................................................oooo...ooooooOOOO;nw%>8-%&;&O>>wVd&OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%OOOOOoooooooooooooooooooooooOOOOOOOOoooooooo................................................................................oooooooooooooooooooooooooooooooooooooooooooooooo...........................................................................ooooo...................................................................................oooooooooooooOOOOOOOO%OOOOooooooooooooooooooo................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................................oooooooooooooooooooooooooooooooooooooooooooooooo.oooooooooooooooooooo..............................oooooooooOOOOOOOOOOOOOOOOOOOO%%OOOOoooooo....",
+"...........ooooo.....................................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...................................................................oooo...ooooooOOOO;nw%wy>%%>>%w>O%OO=OO%%%OOOOOOOOOOOOOOOOOOOOOOOOOOO%%%%%OOOOOooooooooooooooooooooooOOOOOOOOoooooooo................................................................................oooooooooooooooooooooooooooooooooooooooooooooooo...........................................................................ooooo.....................................................................................oooooooooooooOOOO%%OOOOOooooooooooooooooooo................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................................oooooooooooooooooooooooooooooooooooooooooooooooo.oooooooooooooooooooo..............................oooooooooOOOOOOOOOOOOOOOOOOOO%%OOOOooooo.....",
+"................................................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...................................................................................oooooOOOO%&wyO%O%%wTF=C=OOO&OOOOOOOOOOOOOOOOOOOOOOOOO&OO&OO%OOOOOOOOOoooooooooooooooooooooooooooooooooooooooo................ooooo...........................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......................................oo................................................................................ooooooooooooooooOOOOOOOooooooooo.....................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo............................   ....oooooOOOOoooooooOOOOOOOOO................",
+"................................................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...................................................................................ooooooOOO%&8t>*>3*Oe%OOduO&OOOOOOOOOOOOOOOOOOOOOOOOO%&O>,%OOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooo................ooooo...........................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......................................oooooooooooooooooo................................................................ooooooooooooooooOOOOOOoooooooooo.....................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo............................  .....oooooOOOOoooooooOOOOOOOOO................",
+"................................................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo....................................................................................oooooOOOO%>8OuC>OO>O3OSF&oo%OOOOOOOOOOOOOOOOOOOO%&===>ey=OO%OOOOOOOOoooooooooooooooooooooooooooooooooooooooo................ooooo...........................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..........................................oooooooooooooooo................................................................ooooooooooooooooOOOOOOoooooooooo......................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..................................oooooOOOOOOOOOOOOOOOOOOOOO................",
+"................................................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo....................................................................................oooooOOOO%&;%wAOO=3%o&eLSo=oOOOOOOOOOOOOOOOOOO%%&>>,>>ey=OO%oooooooooooooooooooooooooooooooooooooooooooooooo................ooooo...........................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..........................................oooooooooooooooooooo............................................................ooooooooooooooooOOOOOooooooooooo......................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..................................oooooOOOOOOOOOOOOOoooooooo................",
+"................................................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo....................................................................................ooooooOOOO%%u%&O&OO>O3=CY2ooOOOOOOOOOOOOOOOO%%%%%&&&&O&=OoOoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...........................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...................        ................ooooooooooooooooooooooo............................................................oooooooooooooOOOooooooooooooo.......................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.................................oooooOOOOOOOOOOOOOOoooooooo................",
+"................................................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo....................................................................................ooooooOOOOOOu&&%&%3OdeCC^LooOOOOOOOOOOOOOOOO%%%%%O%O&OoOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...........................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo....................        ................oooooooooooooooooooooooo............................................................oooooooooooooooooooooooooooo........................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooo................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................................ooooooOOOOOO%%OOOOOOoooooooo................",
+"................................................................................................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.....................................................................................oooooooOOOO%ww%&dU&&OFS)T4o%%%%%OOOOOOOOOOO%%%%OOOO&ooOoo@oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...........................................................oooooooooooooooooooooooooooooooooooooooooooooooo................................................oo......................          ..............ooooooooooooooooooooooooo............................................................ooooooooooooooooooooooooooo.........................................................ooooooooooooooooooooooooooooooooooooooo................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooo..............................ooooooooOOOOOO%%%OOOOOoooooooo................",
+"................................................................................................oooooooooooooooooooooooooooooooo................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.....................................................................................ooooooooOOOO&&%&eT3e=ooSafo%%%%%OOOOOOOOOOO%%%%%OOOOoo@ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...........................................................oooooooooooooooooooooooooooooooooooooooooooooooo........................................................................            ............ooooooooooooooooooooooooo.............................................................oooooooooooooooooooooooooo..........................................................oooooooooooooooooooooooooooooooooooooo................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooo............................ooooooooooOOOOOO%%%OOOOOooooo...................",
+"................................................................................................oooooooooooooooooooooooooooooooo................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo......................................................................................oooooooooOOO%%%*OO=e42f@LL%%OOOOOOOOOOOOoo%%%%OOOOoooooo..ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...........................................................oooooooooooooooooooooooooooooooooooooooooooooooo...........................................................                             ........oooooooooooooooooooooooo................        .......................................ooooooooooooooooooooooooo...........................................................ooooooooooooooooooooooooooooooooooooo................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooo............................oooooooooOOOOOOOOOOOOOoooooo....................",
+"................................................................................................oooooooooooooooooooooooooooooooo................oooooooooooooooooooooooooooooooooooooooooooooooo.......................................................................................................oooooooooOOOOOOOO===4doSL%%%OOOOoOOooooooOOOOOOOoooooooo.oooooooooooooooo................ooooooooooooooooooooO@++OOooooooooooo...........................................................................oooooooooooooooo..........................................................................                              ........oooooooooooooooooooooo..................        ........................................oooooooooooooooooooooooo............................................................oooo................................................................................................................oooooooooooooooooooooooooooooooooooo............................oooooooooooOOOOOOOOOoooooo......................",
+"................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo........................................................................................................oooooooooooOOOO@=@@==oO=&&&*%OOoooooooooOOOOooooooooo...oooooooooooooooo................oooooooooooooooooooo@++==+@oooooooooo...........................................................................oooooooooooooooo.........................................................................                               ........oooooooooooooooooo......................        .........................................ooooooooooooooooooooooo..............................................................oo................................................................................................................oooooooooooooooooooooooooooooooooooo............................ooooooooooooooooooooooooo.......................",
+"................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..........................................................................................................oooooooooooo@@=+@O=S3O====&OOoooooooo.ooooooooooo.....................................ooooooooooooooooooooooo@=+@oooooooooo...........................................................................oooooooooooooooo........................................................................                                ..................................      ........        ..........................................oooooo..oooooooooooooo................................................................................................................................................................................oooooooooooooooooooooooooooooooooooo.................................oooooooooooooooo...........................",
+"................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..............................................................................................................ooooooooo@@O@OOD3&%&&=+@Ooooo.....oooooo..........................................oooooooooooooooooooooooo@@ooooooooooo...........     ...........................................................oooooooooooooooo........................................................................                                 ...............................                        ...........................................ooooo....oooooooooooo................................................................................................................................................................................oooooooooooooooooooooooooooooooooooo.....................................ooooooo................................",
+"................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...................................................................................................................ooooo@oO*O%O%ooOooooo....... ................................................ooooooooooooooooooooooooooooooooooooo...............    ........................................................oooooooooooooooo........................................................................                                 .............................                          ............................................oooo.....ooooooooooo................................................................................................................................................................................oooooooooooooooooooooooooooooooooooo............................................        ........................",
+"................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................oooooooooooooooo.....................................................................................................................oooooO=O%Owoooooooo....          ..........................................ooooooooooooooooooooooooooooooooooooo...o............   ........................................................oooooooooooooooo........................................................................                                  ..........................                            ............................................oooo......oooooooooo................................................................................................................................................................................oooooooooooooooooooooooooooooooooooo............................................            ....................",
+"................................................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................oooooooooooooooo....................................................................................................................oooooOOOO&%Ooooooooo...             ........................................ooooooooooooooooooooooooooooooooooooo...........XX...   ........................................................oooooooooooooooo........................................................................                                  .......................                               ............................................oooo......oooooooooo................................................................................................................................................................................oooooooooooooooooooooooooooooooooooo............................................             ...................",
+"...........................................................ooooo................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................................................................................................................                                     .......................................................................................oooooooooooooooooooooooooooooooooooo................ooooooo....     ................................oooooooooooooooo................................                                                                                                                                                                        ........ooooooooooooooooooooooooooooooooooooooooooo.....................................................................................................................................................................................................................................................................................",
+"...........................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................................................................................................................                                     .......................................................................................oooooooooooooooooooooooooooooooooooo................ooooooo....     ................................oooooooooooooooo................................                                                                                                                                                                        ........ooooooooooooooooooooooooooooooooooooooooooo.....................................................................................................................................................................................................................................................................................",
+"...........................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................................................................................................................                                     .......................................................................................oooooooooooooooooooooooooooooooooooo................ooooooo....     ................................oooooooooooooooo................................                                                                                                                                                                        ........ooooooooooooooooooooooooooooooooooooooooooo.....................................................................................................................................................................................................................................................................................",
+"...........................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................................................................................................................                                     ......................................................................................ooooooooooooooooooooooooooooooooooooo................ooooooo....     ................................................................................                                                                                                                                                                        ........oooooooooooooooooooooooooooooooooooooooooooo....................................................................................................................................................................................................................................................................................",
+"...........................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo........................................................................................................                                             .....................................................................................oooooo................oooooooooooooooo................ooooooo.....    ................................................................                                                                                                                                                                                        ........................ooooooooooooooooooooooooooooo...................................................................................................................................................................................................................................................................................",
+"...........................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo........................................................................................................                                             ....................................................................................ooooooo................oooooooooooooooo................ooooooo......   oooooooooooooooo................................................                                                                                                                                                                                        ........................oooooooooooooooooooooooooooooooo................................................................................................................................................................................................oooooooooooooooooooooooooooooooo................................................",
+"...........................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooo........................................................................................................................................                                             ...................................................................................oooooooo................oooooooooooooooo................oooooo........  oooooooooooooooo................................................                                                                                                                                                                                        ........................oooooooooooooooooooooooooooooooo................................................................................................................................................................................................oooooooooooooooooooooooooooooooo................................................",
+"...........................................................ooooooooooooooooooooooooooooooooooooooooooooooooooooo........................................................................................................................................                                             ..................................................................................ooooooooo................oooooooooooooooo................oooooo..........oooooooooooooooo................                ................                                                                                                                                                                                        ........................oooooooooooooooooooooooooooooooo................................................................................................................................................................................................oooooooooooooooooooooooooooooooo................................................",
+"...........................................................oooooooooooooooooooooooooooooooooooooooooo...oooooooo........................................                                                                                                                                             .................................................................................oo..oooooo................oooooooooooooooo................ooooo...........oooooooooooooooo........                                                                                                                                                                                                                             ...........................oooooooooooooooooooooooooooooooo................................................................................................................................................................................................oooooooooooooooooooooooo........................................................",
+"...........................................................ooooooooooooooooooooooooooooooooooooo........................................................                                                                                                                                             ................................................................................ooooooooooo................oooooooooooooooo................oo......................................                                                                                                                                                                                                                             ...........................................oooooooooooooooo................................................................................................................................................................................................oooooooooooooooo................................................................",
+"................oooooooooooooooo...........................ooooooooooooooooooooooooooooooooooooo........................................................                                                                                                                                             ...........................................oooooooo................oooooooo....oooooooooooo................oooooooooooooooo........................................................                                                                                                                                                                                                                             ...........................................oooooooooooooooo................................................................................................................................................................................................oooooooo.oooooo.................................................................",
+"................oooooooooooooooo...........................ooooo........................................................................................                                                                                                                                             ...........................................oooooooooooooooooooooooooooooooo...ooooooooooooo................oooooooooooooooo........................................................                                                                                                                                                                                                                             ..............................................ooooooooooooo................................................................................................................................................................................................................................................................................",
+"................oooooooooooooooo...........................ooooo................................................................................                                                                                                                                                     ...........................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo................................................                                                                                                                                                                                                                                     ...............................................oooooooooooo................................................................................................................................................................................................................        ........................................................",
+"................oooooooooooooooo...........................ooooo................                ................................................                                                                                                                                                     ...........................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo..............................oo                                                                                                                                                                                                                                                     ................................................ooooooooooo................................................................................................................................................................................................................                ................................................",
+"................oooooooooooooooo...........................ooooo................                ................................................                                                                                                                                                     ...........................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo............................oooo                                                                                                                                                                                                                                                     ................................................ooooooooooo................................................................................................................................................................................................................                ................................................",
+"................oooooooooooooooo...........................ooooo                                ................................................                                                                                                                                                     ...........................................oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo............................oooo                                                                                                                                                                                                                                                     ................................................ooooooooooo................................................................................................................................................................................................................                ................................................",
+"................oooooooo........................                                                                ................                                                                                                                ................................................................ooooo...........ooooooo.ooo.....oooooOOO==&@ooo.oOOooooooooooooo................................................................................                                                                                                                                                                                      ..........ooo........                     ...ooooooooooooo................................................oooooooooooooooo........oooooooo.......................o..... ..................  .....o...     .....                           ................                                         .....oo          ......                                                     ...oooooooo................",
+"................ooooooo.................                                                                        ................                                                                                                                ................................................................ooo.............oooooooo...oooooooooOOOOOOOooooooooooooooooooooo................................................................................                                                                                                                                                                                      ..........oo.........                     ......oooooooooo................................................oooooooooooooooo.........ooooooo................................................  .........     ....                            ................                                          ......          ....                                                       ...oooooooo................",
+"................ooooooo.................                                                                        ................                                                                                                                ................................................................................oooooooooooo@@oooooOO%%%OOOOooo.OOooooo@oooooooo................................................................................                                                                                                                                                                                      .....................                     ..........oooooo...........................................................................ooooo.................ooooo..........ooo.oooo........  .........     ...                                                                                         ....                                                                     ...oooooooo................",
+"................ooooooo.....                                                                                    ................                                                                                                                ................................................................................oooooooo@ooo@@ooooOOO%%%OOOOOOoo==+Ooooooooooooo................................................................                                                                                ................                                                                                                     ......................                     ...............................................................................................o................oooooooooooooooo@O@oooo.o....... ..........                                                                                                                                                                          ...oooooooo................",
+"................ooooooo.....                                                                                    ........................                                                                                                        ................................................................................oooooooo@ooooOOOOOOOOOOOO%%&==+@==+Ooooooooooooo................................................................                                                                                ................                                                                                        ........    .......................                     ................................................................................................................ooooooOO&OOOO%%&==&&Oooooooo...............                                                                                                                                                                          ...oooooooo................",
+"oooooooooooooooooooooo.....                                                                                     ........................                                                                                                        ................................................................................oooooooooOOOO%&&O%%%->>8uww3==OOOOooooo@oooooooo................................................                                                                                                ........................                                                                                ........   .........................                    ................................................................................................................ooooO%&>w>-%%-6w88,>&%OOoooooo.............                                                                                                                                                                          ..ooooooooooooooooooooooooo",
+"oooooooooooooooooooooo.....                                                                                     ........................                                                                                                        ................................................................................oooooooooO&&&%-;%%;8tyxnViuw>OOooooooooooooooooo................................................                                                                                                ........................                                                                                ....................................................................    ................................................................................ooooooooooooooooOOO%*>wwrw6667rlrrrw8>&&Oooooooo.............                                                                                                                                                                        ..ooooooooooooooooooooooooo",
+"ooooooooooooooooooooo.....                                                                                      ........................                                                                                                        ................................................................................ooooooOOO&>w;----6wtyttww,>&%OOOoOOooooooooooooo................................................                                                                                                oooooooooooooooo........                                                                 .......        ....................................................................    ............................................................................ooooooooooooooooooooOO%;6wrrllr99lvvrllrrw6>OOOooooooooooooo........                                                                                                                                                                    ...ooooooooooooooooooooooooo",
+"oooooooooooooooooooo.......                                                                                     ........................................................................        ............................................................................................................................ooo.oooooOO%O%>;;6rvrtvvtwwwOOOOOOOOoooooooooooooooo................................................                                                ........                        ................oooooooooooooooo................................................................    ............................................................ooooooooooooooooooo........     ................................................o..............o........ooooooooooooooo@ooooooooO-qtrrrrrllllllbvvlrrw88-%%OOOO@OOooooooooo@ooo..             ..      ..       ..........................     .X................                                                                                    ..oooooooooooooooooooooooooo",
+"oooooooooooooooooooo.......                                                                                     ........................................................................        .........................................................................................................................oooooooooOOOOO%->wrrrvxlrlttw8>OOOOOOOOoooooooooooooooo................................................                                                ........                        ................oooooooooooooooo................................................................   ..........ooo..............................oo........@oo..ooo@Oooooooooooooooooooooo@.......................................................o..ooooo.oooooo..ooooooooooooooOOOOOoooooOOOOOOOO%;wrrrrl09llllbblllrrr9wtw>&%OoooOOooooooooooooo....................@@o.........oooooooOOOOOOO+=<==@@ooooo......oo........oooooo..              ........                                                           ...oooooooooooooooooooooooooo",
+"ooooooooooooooooooo.......                                                                                      ........................................................................        .......................................................................................................................o.oooooooOO%%%%--6wtxZmcxvlrrtw>%OOOOOOOOoooooooooooooooo................................................                                                ........                        ................oooooooooooooooo................................................................   ........ooooo............................ooooooooooooooooooooOOoOOOOOOOOOOOOOooooooo@o.......................oooooooooooooooo........oo...oo@oooOOooooooooooooooooO+=11=>>>>>>&****%OOOOOOOOO-6rrrrrlrllllllllllrrrrrrw6>*%%%OOOOOOoooooooOOOoo@@oooo@@@@@@@@+@o@25+oooo@@oooO%*>>>wwwwwwwuuueew332==ooooooo.oooooooooooO@OOo................oooooooo....                    ................                  ...oooooooooo.oooooooooooooooo",
+"................oo........                                          ....                                        .....................................................................................................................................................................................................oooooooooOO%%-;>wwwttvcZZxzvllrw>%OOOOOOOOOoooooooooooooooo................................................................                                ........                        ................................................................................................  ........oooooo...........................ooooooooooooooooOOoooOO%&>>>,uwwww>>>=>>&OoooOoooo...ooooooooooooooooooooooooooooooooooooooooooooooooOOOooOOOoooO&=OOOOOO*>wuuuuuuwwwww6www>-%%%%%%%%70rrrrrlllllllllllllllrr966666ww>;;*%OOoOOOO*>>>33333333wwwww3,,3===33=OOO=32+oo-;wtzxZZxxxxxxcZtyyyyyyy=Oooo+=2>>>>>>>>>>>>=&%Ooooooooooo@@@@ooooOooooooooo....        .       ...oo...................         ....ooooooooo..................",
+"................o........                                       ........                                        ...................................................................................................................................................................................................ooooooOOOOOO%%-;6rxxxcxvxxxzrlvvr>%OOoooooooOoooooooooooooooo................................................................................                ................                ................................................................................................  .......ooooooo..........................oooooooooooooooOOOOO%*;6wyxnxxVVZZVVnxyxxyw;%OOOOOoooooooooooooooooooooooooooooooooooooooooooooooooooo%%%%%&>>&&&>wuw>%-;6wutyttttrrrrrw6wttw6;;;>66660rrrrrrllll00007vvvvvvvvxxxtttttzrrw>:*%OO*>uyyxyyiVVnyyttttrrrrw,;&&%OOO%>uu>%O;7rzxxNZccxxxzzzrrvxcnnntw&&3eddxxxxxxVVxxxytw6>w3>&OOOOOoOOoooo%%%OOOOOoooooooo....................................................oooooooooo..................",
+".........................                                       ................................        ........................................................................................................................................................................................................ooooooooOOOO&>>>--60zNNcZxztzzzrlvvr-OOOoooooooooooooooooooooooo................................................................................                ................                ................................................................................................  ......oooooooo..........................oooooooooooOOOOOOOOO*>rtxZZZcxxxnZZZZZcZZZxu>:OOOoooooooooooooooooooooOOOOOOOOOOOOOOOOooooooooooOOoooO%->wutttwwwutttw7wrtzxzzzzzzlllrrrrrzzlr0rrrlzzxllllllllzzlrrr00vvvxxxxxxxxxxxzzccxztuww>1wtxxxxxxcZZncxxxxvvvvvtw6;%%%%%%>ttw66rlxxxxxxNNccxzzzvvxcccxxxxyxVVVVZZNNNNNNNNNcxxzrxtuw6>>>**%%%OOO%%%%OOOOOOoooooo................oooooooooooooooo....................oooooooooo..................",
+".........................                                       ................................        ........................................................................................................................................................................................................ooooooooOOO%,uttrrrzcZcxxztrrtzzvvl8-OOOoooooooooooooooooooooooo................................................................................                ................                ................................................oooooooooooooooo................................  ......oooooooo.........................ooooooooooOOOO%O%**%-;6zvxccxxvlvxcmZmmxxxxcxw6%%%OOOooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoOOOoO&=9rrvxxvzrttzzzttxxxxxxxvxcccccccxxxxxcccxxxxccccxxxxcxxxxxxxxxxzxxxxxxxcrtzxxxxxcccxxxyyyyyxztrrvvxcccccccccccccxztrw66w66wtxttzcNNNcxccZZZNcxxxbbcccccxccZZZVxxcccxxxxxxxxxxvvvvvvxxxxxtuww,www;;;--%%%>&OOoooo........oo......oooooooooooooooooooooooo............oooooooooo..................",
+".........................                                       ................................       .........................................................................................................................................................................................................oooooooOOOO&wnVnBcccZZczrrrrrrttcvr6-%OOoooooooooooooooooooooooo................................................................................                ................                ................................................oooooooooooooooo................................ .......oooooooo.........................oooooooooOOOO%%O:uyuwwwxxxxxxcccmZZZZcccxvxZZzwuuw>>*%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooO<eZmxzrrlzzvxxxcmZccccxcccccccBcccxccxxxccccccccxxcccNNNNczzzxxxxNxxxxxxxxxxxxxxxxcccxzzttyyytzzxxxxcccccccccccMbbxxxxxxxvxvzxxxcZxcccxxNZccccxxxxbbMMMMccmZZnxxcZBBBcccccccxxxxxccmmmmccxZcytttyyvztrrww6w3=OOoOOooooooooooooo...oooooooooooooooooooooooooooooooo...ooooooooooo..................",
+".......................                                                                                                 ........................                                ......................oooooooooo.....................................................................................ooo@oooooOOOOOOooooooO*wtytrrzxcxxzlllzzzzzrxxw-%OoooooooooOOOOooooooo.................................................................................................................                    .........................................................................               ..      .     .....ooooo...............oooOOOOO%O%666---7--6znxrzzzvvvvvxxccccccxccccccxxxxxxcccxxxxxvvvrrrrrrrr679966;------%%OO%%-%%%%OOOOOOOOOOOOO&3u7rvxvlvxccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxccccccccxxxxxzzzxxxxxxxxxxxxxxxxxxxxxxxxcccccxxxxxxxxxxxcccccccccccccccccccccNNNxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxrr97;--%--;--%OOOoooo..............ooooo................         .......................",
+".......................                                                                                                 ........................                                ........................oooooooo....................................................................................oooooooooOOOOOOOOooo@OO*>w660rxcNcxzzzzzzzzzrzzrww>&ooooooooOOOOooooooo.................................................................................................................                    ........................................................o...............        ................  ......oooooooooo........oooooooooOOOO%%;wrrrrrxtrzxZcxxxxxxxvvxxxxccccxccccccxxxxxxcccxxxxxxxvxxxvvzzzxxxxxvtruuuuuuw66ww>;%%%OOOOOOOOOOOOOOOOrrxxvzvxccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxccccccccxxxxxxzzxxxxxxxxxxxxxxxxxxxxxxxxcccccxxxxxxxxxxxcccccccccccccccccccccNNNxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvzrrr977rrrr6>*%Ooooo......... ......ooo        XXX. ..             ....................",
+".......................                                                                                                 ........................                                ...........................ooooo.................................................................................ooooooooooOOOOOO%%OOOooooO%>wrr0rxNZczlzzzzllrrrlrruu3&ooooooooOOOOooooooo...................................................................................................................  ...........................................ooooooooo............oooooooooooooooo.......................................oooooooOO==@OOOOOOOOOOOOoOO%%%%*;6rxxxxcZxnZnxxxcxxxxxxxxxxxxxxxcxccccccxxxxxxccccxxxxxxxnccccxxxxcnZncxxVxxxxxytyytu6;%%OOOOOOOO%%%%O%%&rvxcxvvxccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxccccccccxxxxxxxzxxxxxxxxxxxxxxxxxxxxxxxxccccccxxxxxxxxxxccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvvvxxxxtuw>>==@@ooo.....   ........        XXX                 ....................",
+"........................                                                                                                                                                                              ..........................................................................................ooooooooOOOOO%%%;>>>>>=&OO%-6tvxrzxNNcxzxxzzzrrrzlr6>>&OooooooooOOOOoooooooo....................................................................................................................................oooooooo...oo...ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...................ooo.oooooOOOOO;3uuww8>>>>>;;;;-->>wuuutyxxncxxcczxccxxxZnncxxxxxxxxxxxxxxccccccxxxxxxccccccxxxxxxxxxxxxxxxxxxxxxcxxxxxtttttrw6>;;;&&%%OO%%OO%;uyvxccxxxxccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccxxxxxxxxccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvvxxxyytyuuu3333+@.           ..                           .....................",
+"........................                                                                                                                                                                                ........................................................................................oooooooOOOO%&>,wtyyyyyyuwwwwrrzzzxxxxcccxxxzzlrrzl0-%OOoooooooooOOOOooooooooo...................................................................................................................................ooooooooooooooooooooooooooooooooOOooooooooooooooOOOOOOOOOO%*&&%%OOOOOooooooooooooooooooooooooooooooooO&==>3,>6uymxxvlrrr99997777>wyVVZZZZZmcxvxcxxxcnZZZZZncxxxxxxxxxxxxxccccccxxxxxxxcccccxxxxxxxxxxxxxxxxcccccnxxxxxztrrrrrw97w886>;;-%%%%-8xZxccccxxxccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccxxxxxxxxccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvvvvrtzxxxxxyyyyyyuu5#@.                                       .....................",
+"........................                                                                                                                                                                                        ............................ooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOO%&6uyVxxxxxyxxVxxztzxxcxxxxxcNccxxxzzzlr6%OOOOooooooooOOOOoooooooooooo..............................................................................................oo................ooooooooooooooooooooooooooooooooOOOOOoooOOOOOOOOooooooooooooooOOOOOOOOOO*:>wwww>w8,;&%OOOOOoooooooooooooooooooooOOOO*>wuutttwrttccvvvvvvvvllr999;6txZcxxccccccccnxxxnZcxnnncxxxxxxxxxxxcxccccccxxxxxxxxxcxxxxxxxxxxxxxxxcccccnnnmcxxxxvlrrrrrrrrwwwwwwww66wwrttxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvvvvvxxxxxxxxyxxxxxp42o.                                   ........................",
+"........................                                                                                                                                                                                        .........................oooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOO%&>wtxnZttttttzxZcxxvxcZcxxxxcccNcccxxxzr0:%%%OOooooooooOOOOoooooooooooo............................................................................................oooo................ooooooooooooooooOOOOOOOOOOOOOO*&&&&&%%OO%%%OOOOOOO%%%%%%%%%%&&&&;;;;;;;;wrttzttttttww6>>>>;&&&&&OOOOOOOOOOOOO%%%>>>wwtyxzzztrrrrcccbbbbccccbvlllwrtxxxxxcccccMMMxxxxxxxvcccxxxxxxxxxccccxccccccxxxxxxxxxxxxxxxxvxxxxcccnxxxxxxxxcxvvvvvlvlrrlvlrtttttttttxxxxxvxccxxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvvxxxxxxxxeee=o...     ...                ................................",
+"ooooooooooooooooo.......                                                                                                                                                                                        .............ooo.....oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOO%>wtxnnxvxvtrrzxxZmcxvvxcxxccNccxNNcccxxxl0-%%*%oooooooooOOOOoooooooooooo...........................................................................................ooooo.........oooooooOOOOOOOOOOOOOOOOOOOOOOOO&&&&&>wuuuuwww8>>>>>>;;;>66wwwwwuuuutyyyxxxxxxxxzzvvxxxxvvvvxxxxttttuwwwww,>>>>>wwwwwwwwtzxxxxvzxxxxxxvvccccccccMcccxvvvcnmcxxcccccccMccxxcxxxxnxxxxxxxxxxccccccxccccccxxxxxxxxxxxxxxvvvxxxxxcccxxxxxxxxcxvvvvvllrrrlvvlmcccxxxxxxxzlzxccxxxccmccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvvvxxxccxxxxxxxxxxxxxvvvuniw&Ooo.......o.............oo.................oooooooooooooooo",
+"oooooooooooooooooo........                                                                                                                                                                                      .........ooooooooooooooooooooooooooooooo@OooooooooooooooooooooooooooooooooooooooOO%%OO%>wttxxvtrzzzzvvxxcxvvvlvxzzxxxxxxccccccxxzzr;%OOOooooooooOOOooooooooooooo..........................................................................................oo....ooo.o..oooooooooOOOOOOO%%%%****%---;>688xxxyttttttttttttxxxxxxxxxxxxxxxxZnnnxxttlllzzzvvxxxxxxxxxxxxxxxxvvvvttttutttyyxxxxxxyyxnzztzzxccxxxxcccccccxcccccccBBcccccccccccccccccccxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccnnncccxxxxxvvvxxvvlvvxxvvvvvvvvvcccccccccccccxxxccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxccccccccccccccccccccccccxccccxxxxxxxxxxxxxxxxxxxzxxxxxxxccccccccccccccccxxxxxxxxcccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccxxvttuuw+Oo@=3ee43<+@@@+oo+2ee42++@oooooooo@@ooooo...ooooooooooo",
+"ooooooooooooooooooo.......                                                                                                                                                                                      .....oooooooooooooooooooooooOOOOOoooooOOooooOOOOoOOOOOOoooooooooooooooooooooOOooOO%%%&>uxyvvvxxxxxxxxxxvxvcccvlvxxxxxxxzccccccxxcct6%OOOooooooooOooooooooooooooo........................................................................................oooooooo..ooooooooooOOOOO%%*>wwuwwwuuuuurrrrttxxxxxxztttrtttzvxxxxxxxxxxxxxxxxxxnnnncxxxzzzvvvvvxxxxxxxxcccccxxxvvvvzttttttzxxxxzzztttzxcxxvvxccxxccccccxxxxxxxxxccNNccxccccccccccccccccxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccxxxxxxxxxvvzzvvvvllvvxvxvvvvvxccccccccccccccxxxccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxccccccccccccccccxxxxxxxxxccccxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccxxxyyuuwuyyyyyyuuuuyyuuuydVyy4333====oooooo@@oooooooooooooooo",
+"oooooooooooooooooooo.......                                                                                                                                                                               ........oooooooooooOOOOOOOOOO%OOOOOOOOOoooooooooooOOOOOoooooooooooOOOOooooooooOOOOOoooO%%%%&>wwwrttvvxxxcnmcxvvxcZcvrlxxxxxzzzcccccxxxcNx6%OOOoooooooooooooooooooooooooooooooo........oooooooooooooooo...........................................................oooooooooooOOOOOOO&>>wwwtttttttyxxxxxxxxxxxcnxxxxvzttllzvxxccxxxxxxxxxxxxxxxxxxcccccxvvvvxxxxxxxxxxxxxxxxxxxxxxxxxvvvvvxxxxxxxxxxvvxxcccxxxccxxxxxxccxxxxxxztzxxxccxxccccccccccccccccxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccxxxxxxxxxxvvzzttxvrrlvvvxvvlvxcmccccccccccccccxxccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxccccccccccccccccxxxxxxxxxccccxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccNNNNNNNNcccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxMccccxxxZxxxZZxtxxyxxxVVVVxxxxxxyyyyyeuu3=OOoooooooooooooooooooo",
+"ooooooooooooooooooooo......                                                                                                                                                                       ..............ooooooooOooO%&&%>>>>3wwwww6>;%%OOOOOooOOOOOOOOOoOOOoOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%OOOO%--;wxnnxvyxxxcccccccZcvrrxxxxxzzzxccccxxxzxx6-OOooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.......................................................o...ooooooOOOOOOO%%%%;6wtxcnnxxtrtzvxxxxxxxxxxxxxxxxxxvvzvvxxxcccxxxxxxxxxxxxxxxxvvxxxxvvxxxxxxccxxxxxxxxxxxxxxxxccccxxxxxxxxxxvvxxxxvvxxccxxxxccxxxxxxxxzxxxxtrrrtzxxxxxccccccccccccccccxxxxxxxxxxxxxxxxccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxvzttxvrrrlvvvlllvxxcccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxxccccxxxxxxxxxxxccccccccccccccccccccccccccccccccNNNNNNNNcccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxbcccxxxxvztvxxxvvvvvvvvvxxvvlzxxyyyyyyuuyuww>=%O@ooooooooooooooo",
+"ooooooooooooooooooooo......                                                                                                                     ................                                ........ooooooooooooooOOOOO&>ww6wwuuyyxxxxcxtw>-OOOOOOOOOOOOOOOOOOOOOOO%OOOOOOOOOOOOOOOOOOOOOOOOoOOOOO%%%;wxZZZnxxxxxcccccccxlrvzzxxxxxxxxccxxxxlxzw>*OoooooooooooooooooOOOOOOOOoooooooooooooooooooooooooooooooo......................................................oooooooooooooOOOOO%-;69rtzvxxcmccxxcccccxxnncxxxxxxxxxxxxxccccccccccccccccccccccccxxxxxxvvxxxxxxxcxxxxxxxxxxxxxxxxccxxxxxxxxxvvvvvllvvlllvzzzzxxxcxxxxxxxxzzxxxzr0rrzxxNxxccccccccccccccccxxxxxxxxxxxxxxxxccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvttzrrrrlzzrrzvxxxxxxxxxxxxxxxxxxxxccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccxccccxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccxxxxxxvzvvxccxxxxxvzlvxxxxxxcttvvvttttttyyuuw@@oooooooooooooo",
+"ooooooooooooooooooooo......                                                                                                 ....................................                                ..ooooooooooooooooooOOOO%*:6utttrrrtyxxxcNZZZxlr**%%OOOOOOO%***%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO*&&&*%%%%%%-;6wrrixxxxcccccxxvrtxzzxxxccxxxxxxxxxzxxtww=OoooooooooooooooOOOOOOOOOOOOOOOOOoooooooooooooooooooooooo......................................................ooooooooooOO%%*::>67rrllllzvxcccccccNccccxccxxxxxxxxxxxxxxcccccccxccccccccccccccccccccccxvxxxxxxxxxxxxxxxxxxxxxxxxxxzzztttvvvvvvzzllvvlllzllzzxxxxxxxxxxxxzxxcxzrrllxxccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzrrrrrrtzztrzxcncxxxxxxxxxxxxxxxxccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccxccccxxxxxxxxxxxxxxxxxxxccccxxxxccccccccccccccccxxxxxxxxcccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccxxxxxxxxzzzxxcxxxxxxxxcccNNcxxvxxxvvttxtrwttyyOooooooooooooooo",
+"oooooooooooooooooooooo.....                                                                                           ..........................ooooooo@oooooooo................                oo@@@@oooooooooooooOOOO%*>wtxxxxttzzxxxxxcNZZZccwwwwwwww>>>wwuww>>>&&%OO&&&%%OOOOOOOOOOOO%%%OO*>eeeww3>&&-%%%%%%wwtxxxcxcvvxzrtxxxxcccxxxxxxxxxzxxztyu>OoooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooo.....................................................oooooooo@@@>>,wwtttrzzxxvvvccccccxxccccccccxxxxxxxxcxxxxxxxcccccccccccccccccccccccccccccccczzxxxxxxxxxxxxxxxxxxxxxxxzzzztttvvvvvvvvvxccxxxxzzzxxxxxxxxxxxxxxccccxllzxcccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccxxxxxxxxxxxxxxxxxxxxvvvztzvvzrrrrrrtvxxzvxxxcxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxxccccxxxxxxxxxxxxxxxxxxxccxxxxxxccccccccccccccccxxxxxxxxcccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyxxxzvvzzzzxxxxcxxxcNxzccvvvvvvcxtrrrw6oooooooooooooooo",
+"oooooooooooooooooooooo.....                                                                                          ...........................ooooo@@+<<=+@ooo................                @++===+@ooooOOOOoooOOO%%:6txxxxxNNcxxxxxxxxxccBBVVVVdiiiyyydVVyyVViyuw,>&&&&%%%OOOOOOOOOO%*%%%&>eeddVdyuuuuw6;%%O*6txcxvvvvxvrtxccNccxxxxxxxxxxzcxttyu=oooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooo.....................................................ooo@@++<223uuutyyxxzzxccccccccccccBxcccccccNccxxxccccxxxxxxccccccccccccccccccccccccvxxccccczzzxxxxxxxxxxxxxcccccxxxxxxxxxxxvvvxxxxxlvxxxvvvxxxxxxxzxxxxxxxxcccccxbvbxccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccxxxxxxxxxxxxxxxxvvzzztttrtttrrw7rrrzxxxvxxvvxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxxccccxxxxxxxxxxxxxxxxxxxxxxxxxxzcccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyytuuuuwuyNxxxxxxxzzzzzNztzxZNxcxvvlvvvrrtvzr6-oooooooooooooooo",
+"OOOOOOOOOOOOOOOOoooo.....             .............             .........                              .................ooooooooooooOOoOOO%%%%%%%%%-;6rtxnZnxr66;6ww;%OO%%%%%%%O%%%%%OOO%%%%%%%%OOO%;wtctr6-%OOoooooOOO%%;6rlvvvxxzzxxcNxxxxxxxxxxxxxxxxNNccxxzzxxxxxxxxcxxxxr6%%%%%%%%%-:7rrrr777rxcccxxxxxxzzzzzzzzzzzxxxcccccccccccccxxxxxxxxyyyyyw&OOoooooooOOOOOoooooooooooOOOOOOOOOOOOOOOOoooooooooooooooo................ooooooooooooooooOOOOOOOOOooooooooOOOOOO%6wtxxxxvzxxxxxxxxxxxxcccxxxxxxxxccccccccxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxcccccccccccxxxxxxxxxxxxxxxxcccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzlrrrrrzlrrrrrrrrrrzzzxxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxrrrrrrrrrrlvxccczxcczzxNcNNNxxxxbbBbbvvvcxu3=+oooooooooooooooooo",
+"OOOOOOOOOOOOOOOOoooo.....             .................         ....... ...                        ..........ooo@ooo..ooooooooooOOOoOO%&O%%OOOOO%%-69rxxxxxxvtrrtyxyuwww>>>>>>;;--%%%%%%%%%-%%OOOOOO%;7rvztw>&%OoooOOO%%%%;7rvvvzzzxxxccxxxxxxxxccccccccccccccccxxxxxxxxcxxxcxr0zrr7;-%%7rtxcxxzrrzcNcxxxxxxxxzzxxxxxxxxxxxxxxccccccccccxxxxxxxxxyyw>%OOOOooooooOOOOooooooooooooOOOOOOOOOOOOOOOOoooooooooooooooo................ooooooooooooooooOOOOOOOOOOOOooo@OOOOO%*;utxxccxxxcccccccxxxxxcccxxxxxxxxccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxcccccccccccxxxxxxxxxxxxxxxxcccccccccccccccccccccxxxxxxxxccccccccccccccccccccccccxxxxxxxxxxxxxzzzzzzzllrrzllrrrrrrrrlzzzxxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxllrrrrrrlzvvxxxxzxcczzzxcccxxxcNbbBcvbvxruq>*Ooooooooooooooooooo",
+"oooooooooooooooooooo......             ........ ........                                     ...........oooooooooooooO=2==+@OOOoOOOOOO&3>>>>>>;;--6rzxxxxvtttvxxxVVxyyxVxxxyyyyywww88866>68w86;-&**;;6wrxxxxtw>>OOOOOOO%%%-69lvvzzxxxxxxccccccccccccccccxxxccNNZxxxxxxxxNxzxxNxxcxxtrr07rtxxcxxxzxcNNxzzzxxxxxxxccccccccxxxxxxxxcccccccccccxxxxxnxu>%OOOOOOoooooOOOOooooooooooooOOOOOOOOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOoOOOoooOOOOOO%>wxccccccxcccccccxxxxxxxccxxxxxxxxccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxcccccccccccxxxxxxxxxxxxxxxxxccccccccccccccccccccxxxxxxxxccccccccccccccccccccccccxxxxxxxxxxxxxxzzxxxzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvzrrrrxxxxxvvvxccccxzzcxzzxccccccxlrrw>>&*Oooooooooooooooooooo",
+"ooooooooooooooooooooooo....                     ................                     .........ooooooooooooooOOOO%%%%->wyyyuw8>>>&&&&&;wuuttyytyy6wrtvvztztttzxcZxxxtttxZZZZZZcccxxxxxxvvrttxxvttuuutttvvvxxxxtww%O%%%%%%%-;7rlvvzzxxcxxxxxxxxxxxxxxxxxxxxxxxccNNxxxxxxxxNxzzxxxzrrtzxxcNttzzzzzzxxccxxzrzzxxccccxxxxxxxxxxxxxxxxccccccccccccxxxxyt8-OOO%OOOoooooOOOooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOO%*::&*:>wycxxxxxxxxxxxxxxzxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxcccccccccccxxxxxxxxxxxxxxxxxxcccccccccccccccccccxxxxxxxxcccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzxxxxxxxxxzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvzlrrxxxxxvvzvxcccxvvzzzzxcxxxxtw>**%OOOOoooooooooooooooooooo",
+"ooooooooooooooooooooooo......                   ................                ........oooooooooooooooOoOO&>3wuvvvlrrvvmmxxvlrryuuuyyyyyyyxxxxxttttrrrrzzzvxxxcxxxxxxxxxxvvvzzzxxxxvvvvvvttvvvxxxxxxxvvxxxxzttt>>>6>>6669rrvvxxzxxccxxxxxxxxxxxzzzzzzzzxxxxxxxxxxxxxxxxxxxxxztrzzzzxxxxxxxzzxxxzzzzzzlrzzxxxcccxxxxxxxxxxxxcccccccccccccccxxxxxt8-%%OOOOOOOOOOOOOOOooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOoooooooooooOOOOOOOOOoOOOOOO%>wwwuutttyxZxxxxxxccxxxxxxxzxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxcccccccccccxxxxxxxxxxxxxxxxxxxccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzxxxxxxxxxxxxxxxxzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvvvvxxxxxxxvvvxxxxxvxxccxzte3=@oooooooooooooooooooooooooooo",
+"ooooooooooooooooooooooooo.......                         .......                ...o@+++OoooOOOOOO%**>>>>>,wuyyxxcccccccvvvvxxccVyyxVVxzxxxxztttztrrrrttxxxxxxxxxxxxxxxvxxvvvvvvvvvvvvvvcxvzllzvxxxxxxvvcxxvvxxxxvvvvvzvvvxxxccxxxxxxxxxzzzzzzzzxxxxxxxxxxxxxzzzxxxxxxxxzzxxcxxzxxxxxzzzxxxzzzxxlllllzzzzzzxxxxxccccccccxxccccccccccccccxxxxxxxxzw6;;;%OOOOOOoooOOOOOoooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOoooooOOOOOOOOOOOooooooOOOOO-wxxyyxxxxxxxxxxccccccccccccxccxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxccccccccccccccccxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzxxxxxxxxzzxxxxxxzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvvxxxxxxnxxxnVnnyxViyuww$@.....o..oooooooooooooooooooooo",
+"ooooooooooooooooooooooooooo.....                                              ..ooO=3eee33>>>>,w66wwwuttxxxxztttvbccccccvbbbccccxyxxxxxvcxxxxvvvvzttttzvxxxxxxxxccxxxxxxcccccccxxxxxxxxxZmcxxxxxcccxcxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxtzxxxxxxxxxxxxxxzzzzzzzzzzzzzzzxlzzzxxxzxxxxxxxxxxxxxcccccccccccxxxxzzzzxxttww6>***%%OOOOOOOOOOoooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooooOOO%%%-6tcxxxxxxvtzvxxccccccxccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccxxxcccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxcccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzxxxxxzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvxxxxxxxViyuyyyeeee4=++=X    .....oooooooooooooooooooooo",
+"ooooooooooooooooooooooooooooo...                                      ......o+<23,,wyViyVnyyyxnnxxxxxxxxnccxxxvvccccxvvxcccccccctxcxvvxmxxxxxxccxxxxxvzzncxxxxxxZcxxxcccxxxxxxxxxxxxxxxxxxxcccxxxxxxxxxxvxxxxxxxvvvvxccxxxxxxxxxcxxzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzxxxzzxxxxxxzzzzxxxxxxxxcxxxzxxxlzzzzzzzzzzzzzzzxxxxxxxxccccccccxxzzzzzzrtxztutttuww>:*%OOOOOOOOOOooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOO%%%ooOO*&:>>6rtxcxxcnmcxxxcxccccccxzxxxxxxxcccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccxxxcccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxcccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzxxxxxzzzzzzzzxxxxxxxxzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxe3<====+545+...o        ..oooooooooooooooooooooo",
+"oooooooooooooooooooooooooooooooo.                               ..o@oo@@ooo@3yyeyyyyyyyxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccxxxxxxxxxxxcccccxxxxxxxxvvvxxxxxccccccccccccccccccccccccccccccccccccxxxxxxxxccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxrrrzxxcNccccccxxxxxxxxxxcccccccczzzzzzzzzzzttttttttyyytt>>:*%OOOOOOOOOOOooooooooooooooooOOOOOooooooOOoooooooooooooooooooOOOOOO%%O%%%%%%%OOOO*1uyxxxxxvvvvxxxcccxvvvvxxxxzxxxcccNxxxxxxxxxxxxxxxxxxxxxxxxxxxccccNccccccccxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccczzxxxxxxzxxxxxxccxxzzxxcxxxxxxxxcxxxxxxzxxxxxxxxxxxxzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvlr+ooooo.......           ..oooooOooooooooOOOooooo",
+"oooooooooooooooooooOOOOOoooooooo....                       XXXXX=13w3wwuw>>wtxytxxxxxxxxxxxxxxxxxxxxxxxcccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxccccccxxxxxxxxvvvxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccxxxxxxxxccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzxxxcccxxxxxxxxxxxxxxxxzzzzzzzzrrrrrrrrzzzzztttrrtttrrruuuwqq,,**%OOOOOoooooo@@ooooooooOOOOOOoooooOOoooooooooooooooooooOO%OOOOOOOO%%%%%***>,wutxxxxvvvvxxxxccxxccccccccxxxxxcccxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccxxxzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvzlo......o..              oooooOOOOOOOOOOOoOOOOOOO",
+"OOOOOOOOoooooooooOOOOOooOooooooo....                     .X$5555utyxyxxxcxxxxxxzxxxxxxxxxxxxxxxxxxxxxxccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxccccccxxxxxxxxvvxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccxxxxxxxxxxccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccxxxxxxxzzzzzzzzzzzzzzrrrrrrrrrrrrrrrrllrrrrrrrrrrrrrrrrrrrwrr6>:-%%%%OOOOOOOOooOOOOOOOOOOOOOOOOOOOOOOoooooooooooooooo%OOOOOO%%%%-;;>>wwuuyyttzzzzvvvvxxxxccxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvzz++++o....             .ooooOOOOOOOOOOOOOOOOOOOOO",
+"oooOOOOOOOOOOoooOOOOOOOOOOOOOOOO..o.             .   .o@@$24aee4zvxxxxxxxxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccxxxxxxxxxxcccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzlllrzzzlrrrr77777777ww0qq6qq;&&%%OOOOOOOOOOOOOOOOO%%OOOOOOOOoooooooo@OooooooOO%%--;;66wrrtttyxxNxxzzzzzzvvvvvxxxxxxxccccccccxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxzxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccNcccxxxxcxxxxxxzzxxccxxzxxxxxxxxzxxxxxxccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvvveee4=o....       .....oooOOOO%%%OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO....          ....ooo<4e4eeeyyyyxxxxcxxxlvxxvvxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccxxxxxxxxxxxxxxxxzzzzzzxxxxxxxcccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccxxxxxxxxxxxxccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzxxxxxxxxxxzzzzzzzzzzzzxxxxxxxxxxxxxxxxccxxxxxxzzzzzllrll000000rr00rrrrwwww6>>;%%%%%%OOOOOOOOOOOO%%%%OOoooooooooooooooO-;;>wwutyzxxxxxxxxxxxxxxzzzzzzzzvxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxzxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccNcccxxxxcxxxxxxzzxxccxxzxxxxxxxxzxxxxxxcccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiyyyu=@@oooo....oooooOO*>>>>>>>6>>>>>>>>&&&%%%%%",
+"ww3>>&&&OOOOOOOOOOOOOOOOOOOOOOOO.....       ....O*11weyyyyxxxxxxcxxxccxxzxxxzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccxxxxxxxxxxxxxxxxzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxvvxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccxxxxxxxxxxxxccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzxxxxxxcxxxxxxzzzzzzzzzzxxxxxxxxxxxxxxxxxxxzzzzzzzxxxvzlxbbvvlllrr000000rrrrrww86666>;;;---------;>66>;-&%%%%%%%%%%%%&>>uuutyxxxzzxxxxxxxxzzzxxxzzzzzzzzvvvxxxxxvvvvvvvvxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxccccccccccccccccxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvtxyw>&>>=<2222w3wwwwuuyttttzzvttttttttttuww886",
+"yyyyuuuu>>;&&&&&&&&&%%%%%%%&&&&&+@....  XXXo@@@@wtyxyxzrzxccccccxvlzxxxxxxxxxyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccczzzzzzzzxxxxxxxxxxxxxxxxxxxxxvvvxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccxxxxyyyyxxxxccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzlllllvxxxxxbvccbbbbbbllllr0rr9wrrrw98rrrrrrrrwwwww888wwwwwwwww88888888888wwttxxxxxxxxtttttzzzxzzzzzzzzzzzxzxxzvvxxxxvzzztttttzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccxxxxxxxxccccccccxxxxxxxxccccccccccccccccxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcvvcxr66uuueeeeexxxxxxxxxxxxxxccxxxxxxxxnnnxxxyy",
+"uuuuyyyyyyyyyuuueeuuwwwwwwwwuuuu42@@@$XX##555555txxzlxccbccBBBbbxvzvxcxxxxyyxiyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccczzzzzzzzxxxxxxxxxxxxxxxxxxxxxvvvxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcxxxxxyyyyxxxxxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzlllxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxzxzzvxbbbbbbbbbbcccxxxxxxxrrrrrr977999rrrrvtttttrrrrwwwwrrrrrtttttxvtttttvyyyyyzzzttzzzzzzxxcccxzlzzzxzxxxzvvxxxxvvzzzzzzzzzzzxxxcxxxxxxxxxxxxxxxxxxxxxxxxxxxccccNccccccccccccccccxxxxxxxxccccccccccccccccxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccczzxxxxxxzxxxxxxccxxzzxxcxxxxxxxxcxxxxxxzxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxvxxxcbbbccvlrrwwwuuuurrrrrrrrxzzzzzzxvvvvvvvvxvvvvttt",
+"rrrrrrzzvvvvvvvvvvvvvxxxvvvvvvvvzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxrllzzxxxzzzzzzzzxxxxxxxxzzzzzzzzcxxxzxxxzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxzxxxxxxxzzzxxccNxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzllzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxzzzzzlllzzzzzzzzxxxxxxxxzzzzzzzzzzzzzzzzxzzzzzzxzzzzzzzzzzzzzzzzzxxxxxxzzzzzzzzzrllzzzxxzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxccccccccccccccccccccccccxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccxxxccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzxxxxxxcccccccccxxxxxxxxxxxxxzzzzzzzzzzzxxxxxxcccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzlrrrlzzzzzzzzzxxxzzzzzzzzzzlllzzzzzzzzzzzzzzzzzzzzzzzz",
+"rrrrrrlzvvvvvvvvvvvvvvxxvvvvvvvvzzzzzzzzzzzzzxxxxxxxxxxxxxxzzllrrrrllzzzxxxxxxxxzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzxxxxxxxzzzxxcccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzrrllzzzzxxzzzzzzxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxzxxxxxxzzzzzzzzzlzzzzzxxzzzzzzzzxxxxxxxxxxxxxxccxxxxxxxxccccccccccccccccccccccccxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccxxxccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzxxxxxxxxzzzzzzzzzzzzxxxxzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzllzxxxxxxzzzlllzzzzzzzzzzzxzzzzzzzzzzzzlllzzzzzzzzzzzzzzzzzzzzzzzz",
+"rrrrrrlzzzzzzzzzvvvvvvvvvvvvvvvvllllllllzzzzzxxxxxxxxxxxxzzlrrrrrrrrrrrrrrrrrrrrrrrrlzzzxxxxxxxxzzxxxxzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzllllllllrrrllzzzxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxzzxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzllzzxxxxxxxxxxxxccccccccccccccccccccccccxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzlllzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccxxxxxxxxxxxxxzzzrrrzzzxxzzzrrlzzzzzzzzzzzzzzzzzzzllzzzzllllzzzzzzzzzzzzzzzzzzzzzzzz",
+"lrrrrrllllllllllvvvvvvvvvvvvvvvvzzzzzzzzzzzzzzzxxxxxxxxxzzlrrrrrrrrrrrrr000000000000rrrrzzzzzzzzrlzzxzzzrrrrrrrrzxxxxxxxxxxzzxxxxxxxxxxxzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzllllllllzzzzxxxxxxxxxxxxzzzzzzzzzzzzzzzzxxxxxxxxzzzzzzzzzzzllzzzxxxxxxxxzzzzzzzzzzxxxxzzzzzzzzzzzzzzzzzzxxxxxxxxzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzxxxxxzzzxxxxxxxxxxxxxxzzxxxxxxcczzzzzzzzzzzzlrrrrlzzzzzzxxxzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccxxxxxxxxxxxxxzzrrrrrrrrrrr0rrlzzllllllllllllllllllzzzlllrrzzzzzzzzzzzzzzzzzzzzzzzz",
+"llrrrrrlllllllllvvvvvvvvxxxxxxxxzzzzzzzzzzzzzzzzllllllllrrrrrrllllrrrrrr0000000077777000rrrrrrrrrrlzzzzlrrrrrrrrzzzxxxxxxxzzzzxxxxxxxxxxzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxccxxxxzzzzzzzzzzzzxxxxxxxxxxxxxxxxzzzzzzzzzzzllzzzrrrrrrrrzzzzzzzzzzzxxzzzzzzzzzzzxxxzzzzzxxxxxxxxcccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzxxxxxxxxxxxxxzzzzxxxxxxczzzzzzzzzzzzzllllzzzzxzzxxxzzzzzzzxxxxzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccxxxxxxxxxxxxxxzzzlrrrrrrrrr00rrrrrrllllllllrrrlllllzzlllrrrzzzzzzzzzzzzzzzzzzzzzzzz",
+"zlrrrrrrrrrrrrrrlllvvvvvvvvvvvvvzzzzzzzzzzzzzzzzrrrrrrrrrrrrlzzzzllrrrrr000000007777000000000000rrrrllllllllllllzzzzxxxxxxzzzzxxxxxxxxxxzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxzzzzzzzzxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxcccccccccccxxzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzxxxxzzzzxxxxxxxxxxxxzzzzzzxxxxxxzzzzzzzzzzzzzzzzzzzxxxzzzzzzlrrrzzxxxxzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzxxccxxzxxxxxxxxxxxxxxxxxxxxxzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzrrllllrr0rrrrrrrrrrrrrrrrrrlllzzllllrrrrzzzzzzzzzzzzzzzzzzzzzzzz",
+"zlrrrrrrrrrrrrrrlllllvvvvvvvvvvvllllllllzzzzzzzzrrrrrrrrrrrrrrrlrrrrrrrr00000000rrrrrrrrrrrrrrrrrrrrrrllzzzzzzzzzzzzxxxxxzzzzzzxxxxxxxxxzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxzzzzzxxxzzzzzzzzxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzxxxxxxzxxxxxxzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzllllllllzzzzzzxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxzzzzzzllrrrzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzxxccxxzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzxxxxxxzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzrrrrrrrrrrrrrrrrrlllzzzzlllrrrrrzzzzzzzzzzzzzzzzzzzzzzzz",
+"zzrrrrrrrrrrrrrrlllllvvvvvvvvvvvrrrrrrrrzzzzzzzzrrrrrrrrrrrrrrrrrrrrrrrrzzzzzzzzzzzzzzzzzzzzzzzzrrrrrrlzrrrrrrrrlzzzzxxxxzzzzzzxxxxxxxxxzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxzzzzzzxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxcxxxxxxxxxxxxxxxxxxxxxxcczzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzxxxxxzxxxxxxzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxzzzzzzzzzzzllzzzzzzzzrllzzzzzzzzzzzllxxzzzzlllzzzzzzlzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzxxccxxzxxxxxxxxxxxxxxxxcccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzxxxxxxzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzxxzzzzzzzzzzzrrrlllzzzzzzzzzzzzlrrrlzrrrrrrrrlllzzzzzlllrrrrrzzzzzzzzzzzzzzzzzzzzzzzz",
+"rrrrrlllllllllllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlzxxcxxxxxxxxxxccccccccxxzzzzxxllrrrrrrxxxxxxxzxxxxxxxxxxxxxxccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxzzzzzzlzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxzzlrrrrrzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxNccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxzzzzzxxxxxxxxxxxxxxxxxzzzzzzzzxxzzzzzzzzzzzllllllllllllllllllllllllzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzxxxxxxxxzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzllrzzzzzzzxzzzzzzzzzzlrrr00rrrrrrllrrrrrrrlllllllllzzzllllllrrrrrrlrrrllzzz",
+"rrrrrlllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrzzxxxxxzxxxxxxxxxxxxxxxxxxzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxzzzzzzzzzzzzzzzzrrrrrlllzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxzzzzzxxxxxxxxxxxxxxxxxzzzzzzzzxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzxxxxxxxxzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzlxxxxxxxxxxccxxzlzzzzllrrrrrrrrrrzzzzzlllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr",
+"rrrrrrllllllllllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlrrrrrrrlzzxxxxxxxxxxxxxzzzzzzzzxxxxxxxxxxxxzzzzzzzxxxxxxxxxxxxxxxzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxzzzzzzzzzzzzzzzzrrrrzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxzzzzxxxxxxzzzzzzzzxxxxzzzzzzxxxxzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzxxxxxxxxzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzcccxxxxxxcNNcxlrrrlzzzzzzzzzlrrrrrrrrrrrrrrrrrrrrrrrrrrrlrrrrrrlrrrlllzz",
+"rrrrrrrrllllllllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlxxcccxxxxxxxxzzzzzzzzxxxxxxxxzzzzzzzzzzzzxxxcxxxxxxxxxxxzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzlllzzzzzzzzzzzzzzzzzzzzzxxxxxxxxzzzzzzzzzzzzzzzzrrrlzzzxzzzzzzzzxxxxxxxxzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxzzxxxxxxzzzzzzzzxxxxxxxxzzxxxxzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzxxxxxxxxzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzllzzxxzzrrrrrrllzzzzzlllrr00000rrrrrrrrrrrrrrrllllllrrrrllzzzzzzzz",
+"rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlzxcccxxxxxxxxzzzzzzzzxxxxxxxxxxxxxxxxzzzzxxxcxxxxxxxxcxxxxzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzrrllzzzzlzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxzzxxxxxxxxxxxxxxxxxxxxxxzxxxxxxzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzxxxxxxxxzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzlrrzlrrrlzzzzzlllllrrrrrrrrrrrrllzzllllllllrrrrrrrrrrrrrrrrrrrrrrrr",
+"llrrrrrrrrrrrrrrttttttttrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrzzlllrrrrlzxxxzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzxxxxxxxxxxxxxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzllllzzzzlllzzzzzxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzxxzzzzllzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxzxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzxxxxxxxxzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzxzlrrzxcxxxxzzzzllzzzzxxxzzzzzllzzzzzzzzrrrrrllzxzzzzzzxzzzlllrr",
+"lllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrzzzllrrrlzzxxzzzxxxxxxxxxxxxxxxxzzxxxxzzzzzzzzzxxxxxxxxxzzzzzzzzxxxzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzlllllrrrlzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzlzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxzzzzxxxxxxxxxxxxxxxxxxxxxxxzzzzzxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzrllzzxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzxxxxxxxxzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzxxcxxxxzzzzxxxxxxxxzzzlrrrrzzzzzzzzlzzzzxxxxxxxxxxxxxxzzzzz",
+"lllrrrrr77777777wwwwwwwwrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrzzxxxxxxxxxxxxzzzzzzzzzzxxxxzzzzzzzxxxxxxxxxxzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzllrrrrrllzzzzccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxzzzzzzxxzzzzzzzzxxxxxxxxxxxzzzzzxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzrrlzzxxxzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxzzzxxxxxzzxxxxxxzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzxxxxxxxxzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzlrrrrrrrlzzzzzzzzzzzzrrrllzzzlrrrrrrlzzzllrrr",
+"zzzzzzzzzlrrrrrr000000007770rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrlllzzzzzzzzzxxxxzzzzzzzxxxxxxxxxzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzxxxxxxxxzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzxxxxxxcxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxcccxxxxxzzzzzzzzzzzlllrrrrrlzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzcxzzzzxxxxxzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxzzzzzzzzxxzzlrrrrrrrrrrrrrrrrrrrzzzzzzzzxxxxxxxxzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzrrrrrrrrllllllllzzzzzzzzrrrrrrrr",
+"llllllllzzrrrrrrzzzzzzzzlzzzzzlrrrrrlzzzzzzzzzzzrrrrrrrrrrrrrrllrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrzzzzzzzxzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccxxxxxxxxxxxxxxxxzzzzzzzzzzzzxxxxxxxxxzzzzzzzzzzzxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxzzzzzzzzzzzzzzzzzzllzzzzzzxxxxxxxxxxzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzxxzzzzxxxxxxxxxxzzzzzzzzxxxxxxxxxxxxxzzzxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxzzzzzzzzzzzllrrrrrrrrrrrrrrrrrrrzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzrrrrrrrrrrrrrrrrrrrrrrrrzzzzzzzzxzzzzzzx",
+"zzzzzzzzzzzlllzzxxxxxxxxxxxxzzlrllzzzxxxxxxxxxxxllllllllzzzzzzzzrrrllrrrrrrrrrrrrrrrrrrrrrrrrrrrzzzzzzxxzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzxxxxxxxxzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxzzzxxxxxxxxxxxxxzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzxxxxxxxxxxxzzxxxxxxxxxxxzzzzzzzzxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzllllllrrzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzrrrrrrrrrrrrrrrrrrrrrrrrzzzzzzzzxxxxxxxx",
+"xxxxxxxxxxzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzrrrrllllrrrllrrrrrrrrrrrllzzzzzzzzzzllrrzzzzzzxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzrrrrrrrrzzzzzzzzxxxxxxxxzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzxxxxxxxxxxxxxxxxccccccccxxxxxxxxcccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzxxxxxxxxxxxxxxxccxxxxxxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzlllzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxzzxxx",
+"zzzzzzzzxxxxxxxxxxxxxxxxccNNZZNNccxxxzzzllllllllzzzzzzzz000000rrrrzzzzrrrrrrrrrrzzzzzzzzzzzzzlllzzzzzzxxxxxxxxxxzzzzzzzzxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzxxxxccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzxxxxxxxxxxxccccccccccccccccxxxxxxxxccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccxxxxxzzzzzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzxxxxxxxxxxxxxxcccxxxxxxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxxxxxxxxzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzxxxxxzzzzxx",
+"zzzzzzzzxxxcccxxxxxxxxxxccNNccxxcccxxzzzzzzzzzzzxxxxxxxxrrrrrrrlxxxccxxxllllllllrrrrrrrrllrrrrrrzzzzzxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccxxxxxxxxxxxxxxxxxxxxxxxxzzxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzxxxxxxxxzzzzxxxxxxxxxxxxzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxccxxxxxxxxxxxxxxxxxcccxxxxxxxxzzzzzzzzxxxxxxxxxxxcccccccccccccccccxxxxxxxxxxxxxxxxxxxxzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzxxxxxxxxxxxxxxxxzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzxxxxxxxxxxxx",
+"xxxxxxxxzxxccccxccccccccxxxxxxzzccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzllrrrzzzzzzzzxzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzxxxxxxxxxxxxxccccNNNNccccccccxxxxxxxxxxxxxxxxccccccccxxccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxzzxxxxxxzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxccxxxxcccccccczxxxccccxxxxxxxxzzzzzzzzxxxxxxxxxxxxxcccxxxxxxxxxxxxxxccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccxxxxxxxxcccccxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxzzzxxxxxccxxxxcc",
+"zzzzzzzzzxxccccxcccccccccccNNcccxxxcccNNxxxxxxxxxxxxxxxxzzxxxxxxxxxzzxxxzzzzzzzzccxxxxxxxxcccNNNxzzzzxxxxxxxxxxxzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxzzzzzzzzzzxxxxxxzzzzzzzzzzzzzzzzxxxxxxxxxxxzzzzzzzzxxxxxxxxxxxxxxxccccccxxxxxxxxccccccccxxxxxxxxccccccccxxxccccNxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzxxxxxxxxxxxxxcxxxxxxzxxxxxzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxccccxxxcccccccczxxxccccxxxzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzxxxxxxcxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzxxxxxxxxxxxxxxxxzzzzzzzzxxxxxxxxzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccxxxxxxxxcccccxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxzzzxxxxxxxxxxxxx",
+"xxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxccccccccccccccxxxxxccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
+"xxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccxxxxxxxxxxxxxccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzzzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
+"xxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccxxxxxxxxxxxxxcccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
+"ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxccccccccccccccccxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxccccccccccccccxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxccccccccxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxccxxxxxxxxxxxxxxxxxxxxxxccxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxcxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
+"ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxccccccccccccccccxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxccccccccccccccxxxxxxxxxxxxxccccccccxxxxxxxxxxxxxxxxxxxxxxxxzzzzzzzzxxxxxxccxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxccccccccxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxccccxxxxxxxxxxxxxxxxxxxxccccxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxccxxxxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
+"ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxccccccccxxxxxccccccccccccccxxxxxcccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxccccccccxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxccccxxxxxxxxxxccccccccxxccccxxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxxxxxxxxxxxxxccccccccxxxxxxxxccccccccxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxccccccccxxxxxccccccccccccccxxxxxccccccccccccccccccccccccccccccccccccxxxxxxxxxxxxcccccxxxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxccccccxxxxxxxxxccccccccxccccccxccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxcccccccccccxxcccxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxccccccccxxxxxxxxccccccccxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxccccccccxxxxxccccccccccccccxxxxxccccccccccccccccccccccccccccccccccccccxxccccccccNNNccccxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxccccccxxxxxxxxxccccccccxccccccxccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxcccccccccccxxcccxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccxxxxxxxxccccccccccccccccccccccccxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
+};
index a96233808c6e522b7cc75e6059a21ef97bded5c3..1a2485251c33a70432394c93fb89330ef214bfc9 100755 (executable)
@@ -1,18 +1 @@
 #!/bin/sh
-# Copyright Â© 2003, 2004, 2005 Jamie Zawinski <jwz@jwz.org>
-#
-# 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.
-#
-# Created: 30-Aug-2003.
-#
-# Spits out the text of the most recent public posts on livejournal.com.
-# This works as the "-program" argument to phosphor, starwars, etc.
-
-exec xscreensaver-text \
-  --url http://www.livejournal.com/stats/latest-rss.bml "$@"
index 70c138168aa1135a0026cea29519d28361453b31..ecc96256ff489582003d8867f6b53374efbde896 100644 (file)
@@ -302,6 +302,18 @@ open_file (state *st)
 #endif
 
 
+/* "The brk and sbrk functions are historical curiosities left over
+   from earlier days before the advent of virtual memory management."
+      -- sbrk(2) man page on BSD systems, as of 1995 or so.
+ */
+#ifdef HAVE_SBRK
+# if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2)) /* gcc >= 4.2 */
+   /* Don't print "warning: 'sbrk' is deprecated". */
+#  pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+# endif
+#endif
+
+
 static unsigned int
 more_bits (state *st, scroller *sc)
 {
@@ -345,13 +357,6 @@ more_bits (state *st, scroller *sc)
         sc->data = lomem;
 
 # ifdef HAVE_SBRK  /* re-get it each time through */
-      /* "The brk and sbrk functions are historical curiosities left over
-         from earlier days before the advent of virtual memory management."
-            -- sbrk(2) man page on MacOS
-       */
-#  if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2)) /* gcc >= 4.2 */
-#   pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-#  endif
       himem = ((unsigned char *) sbrk(0)) - (2 * sizeof(void *));
 # endif
 
index 77232143279e8bc49a43ac319bc49ce692bb2d64..7504d2ce6b39d8904707e92f74e958cb0ba3ec41 100755 (executable)
@@ -1,5 +1,5 @@
 #!/usr/bin/perl -w
-# Copyright Â© 2008-2012 Jamie Zawinski <jwz@jwz.org>
+# Copyright Â© 2008-2014 Jamie Zawinski <jwz@jwz.org>
 #
 # Permission to use, copy, modify, distribute, and sell this software and its
 # documentation for any purpose is hereby granted without fee, provided that
@@ -18,15 +18,14 @@ use diagnostics;
 use strict;
 
 my $progname = $0; $progname =~ s@.*/@@g;
-my $version = q{ $Revision: 1.8 $ }; $version =~ s/^[^\d]+([\d.]+).*/$1/;
+my ($version) = ('$Revision: 1.10 $' =~ m/\s(\d[.\d]+)\s/s);
 
 my $verbose = 0;
 
 # 1 means disabled: marked with "-" by default in the .ad file.
-# 2 means retired: not mentioned in .ad at all.
+# 2 means retired: not mentioned in .ad at all (parsed from Makefile).
 #
 my %disable = ( 
-   'abstractile'       => 1,
    'antinspect'                => 1,
    'antmaze'           => 1,
    'antspotlight'      => 1,
@@ -36,10 +35,8 @@ my %disable = (
    'dnalogo'           => 1,
    'fadeplot'          => 1,
    'glblur'            => 1,
-   'glplanet'          => 1,
    'glslideshow'       => 1,
    'jigglypuff'                => 1,
-   'juggle'            => 2,
    'kaleidescope'      => 1,
    'lcdscrub'          => 1,
    'loop'              => 1,
@@ -56,19 +53,18 @@ my %disable = (
    'thornbird'         => 1,
    'vidwhacker'                => 1,
    'webcollage'                => 1,
-   'xsublim'           => 2,
   );
 
 
 # Parse the RETIRED_EXES variable from the Makefiles to populate %disable.
+# Duplicated in ../OSX/build-fntable.pl.
 #
 sub parse_makefiles() {
   foreach my $mf ( "Makefile.in", "glx/Makefile.in" ) {
-    my $body = '';
-    local *IN;
-    open (IN, "<$mf") || error ("$mf: $!");
-    while (<IN>) { $body .= $_; }
-    close IN;
+    open (my $in, '<', $mf) || error ("$mf: $!");
+    local $/ = undef;  # read entire file
+    my $body = <$in>;
+    close $in;
 
     $body =~ s/\\\n//gs;
     my ($var)  = ($body =~ m/^RETIRED_EXES\s*=\s*(.*)$/mi);
@@ -87,11 +83,10 @@ sub munge_ad($) {
 
   parse_makefiles();
 
-  my $body = '';
-  local *IN;
-  open (IN, "<$file") || error ("$file: $!");
-  while (<IN>) { $body .= $_; }
-  close IN;
+  open (my $in, '<', $file) || error ("$file: $!");
+  local $/ = undef;  # read entire file
+  my $body = <$in>;
+  close $in;
   my $obody = $body;
 
   my ($top, $mid, $bot) = ($body =~ m/^(.*?\n)(\*hacks\..*?\n)(\n.*)$/s);
@@ -107,10 +102,10 @@ sub munge_ad($) {
   $dir =~ s@/[^/]*$@@s;
   my @counts = (0,0,0,0,0,0,0,0,0,0);
   foreach my $xml (sort (glob ("$dir/../hacks/config/*.xml"))) {
-    my $b = '';
-    open (IN, "<$xml") || error ("$xml: $!");
-    while (<IN>) { $b .= $_; }
-    close IN;
+    open (my $in, '<', $xml) || error ("$xml: $!");
+    local $/ = undef;  # read entire file
+    my $b = <$in>;
+    close $in;
     my ($name) = ($b =~ m@<screensaver[^<>]*\b_label=\"([^<>\"]+)\"@s);
     error ("$xml: no name") unless $name;
 
@@ -202,10 +197,9 @@ sub munge_ad($) {
   # Write file if changed.
   #
   if ($body ne $obody) {
-    local *OUT;
-    open (OUT, ">$file") || error ("$file: $!");
-    print OUT $body;
-    close OUT;
+    open (my $out, '>', $file) || error ("$file: $!");
+    print $out $body;
+    close $out;
     print STDERR "$progname: wrote $file\n";
   } elsif ($verbose) {
     print STDERR "$progname: $file unchanged\n";
index 2e0782714791f302c92ad72e3963c63b8c3e3f09..b491224be11fec30373d2fd40113a93540dc2ebe 100644 (file)
@@ -17,6 +17,7 @@
 #include "screenhack.h"
 #include "xpm-pixmap.h"
 #include "textclient.h"
+#include "xft.h"
 
 #ifdef HAVE_COCOA
 # define HAVE_XPM
@@ -31,7 +32,10 @@ struct state {
   int Width, Height;
   GC fg_gc, bg_gc, text_fg_gc, text_bg_gc;
   int x, y;
-  XFontStruct *font;
+
+  XftFont  *xftfont;
+  XftColor  xftcolor;
+  XftDraw  *xftdraw;
 
   unsigned long interval;
   Pixmap left1, left2, right1, right2;
@@ -376,10 +380,15 @@ talk (struct state *st, int force_erase)
 
     if (!(p2 = strchr(p, '\n')) || !p2[1])
       {
+        XGlyphInfo extents;
+
        total = strlen (st->words);
        strncpy (args[0], st->words, LINELEN);
        args[0][LINELEN - 1] = 0;
-       width = XTextWidth(st->font, st->words, total);
+        XftTextExtentsUtf8 (st->dpy, st->xftfont, 
+                            (FcChar8 *) st->words, total,
+                            &extents);
+        width = extents.xOff;
        height = 0;
       }
     else
@@ -387,9 +396,16 @@ talk (struct state *st, int force_erase)
       for (height = 0; p; height++)
        {
          int             w;
+          XGlyphInfo extents;
          *p2 = 0;
-         if ((w = XTextWidth(st->font, p, p2 - p)) > width)
-           width = w;
+
+          XftTextExtentsUtf8 (st->dpy, st->xftfont, 
+                              (FcChar8 *) p, p2 - p,
+                              &extents);
+          w = extents.xOff;
+         if (w > width)
+            width = w;
+
          total += p2 - p;      /* total chars; count to determine reading
                                 * time */
          (void) strncpy(args[height], p, LINELEN);
@@ -410,7 +426,7 @@ talk (struct state *st, int force_erase)
      * new box by 15 pixels on the sides (30 total) top and bottom.
      */
     st->s_rect.width = width + 30;
-    st->s_rect.height = height * font_height(st->font) + 30;
+    st->s_rect.height = height * font_height(st->xftfont) + 30;
     if (st->x - st->s_rect.width - 10 < 5)
        st->s_rect.x = 5;
     else if ((st->s_rect.x = st->x + 32 - (st->s_rect.width + 15) / 2)
@@ -433,7 +449,7 @@ talk (struct state *st, int force_erase)
         st->s_rect.x + 7, st->s_rect.y + 7, st->s_rect.width - 15, st->s_rect.height - 15);
 
     st->X = 15;
-    st->Y = 15 + font_height(st->font);
+    st->Y = 15 + font_height(st->xftfont);
 
     /* now print each string in reverse order (start at bottom of box) */
     for (Z = 0; Z < height; Z++)
@@ -442,9 +458,11 @@ talk (struct state *st, int force_erase)
         /* If there are continuous new lines, L can be 0 */
         if (L && (args[Z][L-1] == '\r' || args[Z][L-1] == '\n'))
           args[Z][--L] = 0;
-       XDrawString(st->dpy, st->window, st->text_fg_gc, st->s_rect.x + st->X, st->s_rect.y + st->Y,
-                   args[Z], L);
-       st->Y += font_height(st->font);
+        XftDrawStringUtf8 (st->xftdraw, &st->xftcolor, st->xftfont,
+                           st->s_rect.x + st->X, st->s_rect.y + st->Y,
+                           (FcChar8 *) args[Z], L);
+
+       st->Y += font_height(st->xftfont);
     }
     st->interval = (total / 15) * 1000;
     if (st->interval < 2000) st->interval = 2000;
@@ -523,7 +541,7 @@ static const char *noseguy_defaults [] = {
   "*fpsSolid:   true",
   "*program:    xscreensaver-text",
   "*usePty:      False",
-  ".font:       -*-new century schoolbook-*-r-*-*-*-180-*-*-*-*-*-*",
+  ".font:       -*-helvetica-medium-r-*-*-*-140-*-*-*-*-*-*",
   0
 };
 
@@ -566,13 +584,15 @@ noseguy_init (Display *d, Window w)
 
   init_images(st);
 
-  if (!fontname || !*fontname)
-    fprintf (stderr, "%s: no font specified.\n", progname);
-  st->font = XLoadQueryFont(st->dpy, fontname);
-  if (!st->font) {
-    fprintf (stderr, "%s: could not load font %s.\n", progname, fontname);
-    exit(1);
-  }
+  st->xftfont = XftFontOpenXlfd (st->dpy, screen_number (xgwa.screen),
+                                 fontname);
+  XftColorAllocName (st->dpy, xgwa.visual, xgwa.colormap,
+                     get_string_resource (st->dpy,
+                                          "textForeground", "Foreground"),
+                     &st->xftcolor);
+  st->xftdraw = XftDrawCreate (st->dpy, st->window, xgwa.visual,
+                               xgwa.colormap);
+
 
   fg = get_pixel_resource (st->dpy, cmap, "foreground", "Foreground");
   bg = get_pixel_resource (st->dpy, cmap, "background", "Background");
@@ -584,26 +604,25 @@ noseguy_init (Display *d, Window w)
   if (! get_string_resource (st->dpy, "textBackground", "Background"))
     text_bg = fg;
 
-  gcvalues.font = st->font->fid;
   gcvalues.foreground = fg;
   gcvalues.background = bg;
   st->fg_gc = XCreateGC (st->dpy, st->window,
-                         GCForeground|GCBackground|GCFont,
+                         GCForeground|GCBackground,
                     &gcvalues);
   gcvalues.foreground = bg;
   gcvalues.background = fg;
   st->bg_gc = XCreateGC (st->dpy, st->window,
-                         GCForeground|GCBackground|GCFont,
+                         GCForeground|GCBackground,
                     &gcvalues);
   gcvalues.foreground = text_fg;
   gcvalues.background = text_bg;
   st->text_fg_gc = XCreateGC (st->dpy, st->window,
-                              GCForeground|GCBackground|GCFont,
+                              GCForeground|GCBackground,
                          &gcvalues);
   gcvalues.foreground = text_bg;
   gcvalues.background = text_fg;
   st->text_bg_gc = XCreateGC (st->dpy, st->window, 
-                              GCForeground|GCBackground|GCFont,
+                              GCForeground|GCBackground,
                          &gcvalues);
   st->x = st->Width / 2;
   st->y = st->Height / 2;
index 47f58dcc7db36ea1de3bc9798921eabbffff49b7..825ad56931d25ff9858ae5a2744ed8841924cb8e 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "screenhack.h"
 #include "textclient.h"
+#include "utf8wc.h"
 
 #define FUZZY_BORDER
 
@@ -73,9 +74,12 @@ typedef struct {
   int scale;
   int ticks;
   int mode;
+
   int escstate;
   int csiparam[NPAR];
   int curparam;
+  int unicruds; char unicrud[7];
+
   p_char **chars;
   p_cell *cells;
   XGCValues gcv;
@@ -728,6 +732,8 @@ scroll (p_state *state)
 static void
 print_char (p_state *state, int c)
 {
+  int cols = state->grid_width;
+  int rows = state->grid_height;
   p_cell *cell = &state->cells[state->grid_width * state->cursor_y
                               + state->cursor_x];
 
@@ -745,7 +751,11 @@ print_char (p_state *state, int c)
                        CRLF line endings instead of bare LF, so that's no good.
                      */
     {
-      int i, start, end;
+      int i;
+      int start, end;
+
+      /* Mostly duplicated in apple2-main.c */
+
       switch (state->escstate)
        {
        case 0:
@@ -760,20 +770,23 @@ print_char (p_state *state, int c)
                state->cursor_x--;
              break;
            case 9: /* HT */
-             if (state->cursor_x < state->grid_width - 8)
+             if (state->cursor_x < cols - 8)
                {
                  state->cursor_x = (state->cursor_x & ~7) + 8;
                }
              else
                {
                  state->cursor_x = 0;
-                 if (state->cursor_y < state->grid_height - 1)
+                 if (state->cursor_y < rows - 1)
                    state->cursor_y++;
                  else
                    scroll (state);
                }
              break;
            case 10: /* LF */
+# ifndef HAVE_FORKPTY
+              state->cursor_x = 0;     /* No ptys on iPhone; assume CRLF. */
+# endif
            case 11: /* VT */
            case 12: /* FF */
              if(state->last_c == 13)
@@ -782,14 +795,14 @@ print_char (p_state *state, int c)
                  cell->p_char = state->chars[state->bk];
                  cell->changed = True;
                }
-             if (state->cursor_y < state->grid_height - 1)
+             if (state->cursor_y < rows - 1)
                state->cursor_y++;
              else
                scroll (state);
              break;
            case 13: /* CR */
              state->cursor_x = 0;
-             cell = &state->cells[state->grid_width * state->cursor_y];
+             cell = &state->cells[cols * state->cursor_y];
              if((cell->p_char == NULL) || (cell->p_char->name == CURSOR_INDEX))
                state->bk = ' ';
              else
@@ -797,8 +810,7 @@ print_char (p_state *state, int c)
              break;
            case 14: /* SO */
            case 15: /* SI */
-             /* Dummy case - I don't want to load several fonts for
-                the maybe two programs world-wide that use that */
+              /* Dummy case - there is one and only one font. */
              break;
            case 24: /* CAN */
            case 26: /* SUB */
@@ -818,6 +830,49 @@ print_char (p_state *state, int c)
              state->curparam = 0;
              break;
            default:
+
+              /* states 102-106 are for UTF-8 decoding */
+
+              if ((c & 0xE0) == 0xC0) {        /* 110xxxxx: 11 bits, 2 bytes */
+                state->unicruds = 1;
+                state->unicrud[0] = c;
+                state->escstate = 102;
+                break;
+              } else if ((c & 0xF0) == 0xE0) { /* 1110xxxx: 16 bits, 3 bytes */
+                state->unicruds = 1;
+                state->unicrud[0] = c;
+                state->escstate = 103;
+                break;
+              } else if ((c & 0xF8) == 0xF0) { /* 11110xxx: 21 bits, 4 bytes */
+                state->unicruds = 1;
+                state->unicrud[0] = c;
+                state->escstate = 104;
+                break;
+              } else if ((c & 0xFC) == 0xF8) { /* 111110xx: 26 bits, 5 bytes */
+                state->unicruds = 1;
+                state->unicrud[0] = c;
+                state->escstate = 105;
+                break;
+              } else if ((c & 0xFE) == 0xFC) { /* 1111110x: 31 bits, 6 bytes */
+                state->unicruds = 1;
+                state->unicrud[0] = c;
+                state->escstate = 106;
+                break;
+              }
+
+            PRINT:
+
+              /* If the cursor is in column 39 and we print a character, then
+                 that character shows up in column 39, and the cursor is no
+                 longer visible on the screen (it's in "column 40".)  If
+                 another character is printed, then that character shows up in
+                 column 0, and the cursor moves to column 1.
+
+                 This is empirically what xterm and gnome-terminal do, so that
+                 must be the right thing.  (In xterm, the cursor vanishes,
+                 whereas; in gnome-terminal, the cursor overprints the
+                 character in col 39.)
+               */
              cell->state = FLARE;
              cell->p_char = state->chars[c];
              cell->changed = True;
@@ -826,10 +881,10 @@ print_char (p_state *state, int c)
              if (c != ' ' && cell->p_char->blank_p)
                cell->p_char = state->chars[CURSOR_INDEX];
 
-             if (state->cursor_x >= state->grid_width - 1)
+             if (state->cursor_x >= cols - 1 /*####*/)
                {
                  state->cursor_x = 0;
-                 if (state->cursor_y >= state->grid_height - 1)
+                 if (state->cursor_y >= rows - 1)
                    scroll (state);
                  else
                    state->cursor_y++;
@@ -849,7 +904,7 @@ print_char (p_state *state, int c)
              state->escstate = 0;
              break;
            case 'D': /* Linefeed */
-             if (state->cursor_y < state->grid_height - 1)
+             if (state->cursor_y < rows - 1)
                state->cursor_y++;
              else
                scroll (state);
@@ -880,10 +935,14 @@ print_char (p_state *state, int c)
                state->csiparam[i] = 0;
              state->curparam = 0;
              break;
-           case '%': /* Select charset */
-             /* No, I don't support UTF-8, since the phosphor font
-                isn't even Unicode anyway. We must still catch the
-                last byte, though. */
+            case '%': /* Select charset */
+              /* @: Select default (ISO 646 / ISO 8859-1)
+                 G: Select UTF-8
+                 8: Select UTF-8 (obsolete)
+
+                 We can just ignore this and always process UTF-8, I think?
+                 We must still catch the last byte, though.
+               */
            case '(':
            case ')':
              /* I don't support different fonts either - see above
@@ -924,15 +983,15 @@ print_char (p_state *state, int c)
            case '@':
              for (i = 0; i < state->csiparam[0]; i++)
                {
-                 if(++state->cursor_x > state->grid_width)
+                 if(++state->cursor_x > cols)
                    {
                      state->cursor_x = 0;
-                     if (state->cursor_y < state->grid_height - 1)
+                     if (state->cursor_y < rows - 1)
                        state->cursor_y++;
                      else
                        scroll (state);
                    }
-                 cell = &state->cells[state->grid_width * state->cursor_y + state->cursor_x];
+                 cell = &state->cells[cols * state->cursor_y + state->cursor_x];
                  if (cell->state == FLARE || cell->state == NORMAL)
                    {
                      cell->state = FADE;
@@ -956,16 +1015,16 @@ print_char (p_state *state, int c)
            case 'B':
              if (state->csiparam[0] == 0)
                state->csiparam[0] = 1;
-             if ((state->cursor_y += state->csiparam[0]) >= state->grid_height - 1)
-               state->cursor_y = state->grid_height - 1;
+             if ((state->cursor_y += state->csiparam[0]) >= rows - 1 /*####*/)
+               state->cursor_y = rows - 1;
              state->escstate = 0;
              break;
            case 'a':
            case 'C':
              if (state->csiparam[0] == 0)
                state->csiparam[0] = 1;
-             if ((state->cursor_x += state->csiparam[0]) >= state->grid_width - 1)
-               state->cursor_x = state->grid_width - 1;
+             if ((state->cursor_x += state->csiparam[0]) >= cols - 1 /*####*/)
+               state->cursor_x = cols - 1;
              state->escstate = 0;
              break;
            case 'D':
@@ -976,22 +1035,22 @@ print_char (p_state *state, int c)
              state->escstate = 0;
              break;
            case 'd':
-             if ((state->cursor_y = (state->csiparam[0] - 1)) >= state->grid_height - 1)
-               state->cursor_y = state->grid_height - 1;
+             if ((state->cursor_y = (state->csiparam[0] - 1)) >= rows - 1 /*####*/)
+               state->cursor_y = rows - 1;
              state->escstate = 0;
              break;
            case '`':
            case 'G':
-             if ((state->cursor_x = (state->csiparam[0] - 1)) >= state->grid_width - 1)
-               state->cursor_x = state->grid_width - 1;
+             if ((state->cursor_x = (state->csiparam[0] - 1)) >= cols - 1 /*####*/)
+               state->cursor_x = cols - 1;
              state->escstate = 0;
              break;
            case 'f':
            case 'H':
-             if ((state->cursor_y = (state->csiparam[0] - 1)) >= state->grid_height - 1)
-               state->cursor_y = state->grid_height - 1;
-             if ((state->cursor_x = (state->csiparam[1] - 1)) >= state->grid_width - 1)
-               state->cursor_x = state->grid_width - 1;
+             if ((state->cursor_y = (state->csiparam[0] - 1)) >= rows - 1 /*####*/)
+               state->cursor_y = rows - 1;
+             if ((state->cursor_x = (state->csiparam[1] - 1)) >= cols - 1 /*####*/)
+               state->cursor_x = cols - 1;
              if(state->cursor_y < 0)
                state->cursor_y = 0;
              if(state->cursor_x < 0)
@@ -1000,11 +1059,11 @@ print_char (p_state *state, int c)
              break;
            case 'J':
              start = 0;
-             end = state->grid_height * state->grid_width;
+             end = rows * cols;
              if (state->csiparam[0] == 0)
-               start = state->grid_width * state->cursor_y + state->cursor_x;
+               start = cols * state->cursor_y + state->cursor_x;
              if (state->csiparam[0] == 1)
-               end = state->grid_width * state->cursor_y + state->cursor_x;
+               end = cols * state->cursor_y + state->cursor_x;
              for (i = start; i < end; i++)
                {
                  cell = &state->cells[i];
@@ -1019,7 +1078,7 @@ print_char (p_state *state, int c)
              break;
            case 'K':
              start = 0;
-             end = state->grid_width;
+             end = cols;
              if (state->csiparam[0] == 0)
                start = state->cursor_x;
              if (state->csiparam[1] == 1)
@@ -1035,6 +1094,9 @@ print_char (p_state *state, int c)
                }
              state->escstate = 0;
              break;
+            case 'm': /* Set attributes unimplemented (bold, blink, rev) */
+              state->escstate = 0;
+              break;
            case 's': /* Save position */
              state->saved_x = state->cursor_x;
              state->saved_y = state->cursor_y;
@@ -1074,6 +1136,39 @@ print_char (p_state *state, int c)
        case 3:
          state->escstate = 0;
          break;
+
+        case 102:
+        case 103:
+        case 104:
+        case 105:
+        case 106:
+          {
+            int total = state->escstate - 100;  /* see what I did there */
+            if (state->unicruds < total) {
+              /* Buffer more bytes of the UTF-8 sequence */
+              state->unicrud[state->unicruds++] = c;
+            }
+
+            if (state->unicruds >= total) {
+              /* Done! Convert it to Latin1 and print that. */
+              char *s;
+              state->unicrud[state->unicruds] = 0;
+              s = utf8_to_latin1 ((const char *) state->unicrud, False);
+              state->unicruds = 0;
+              state->escstate = 0;
+              if (s) {
+                c = (unsigned char) s[0];
+                free (s);
+                goto PRINT;
+              } else {
+                c = 0;
+              }
+            }
+          }
+          break;
+
+        default:
+          abort();
        }
       set_cursor (state, True);
     }
@@ -1089,7 +1184,7 @@ print_char (p_state *state, int c)
          else
            {
              state->cursor_x = 0;
-             if (state->cursor_y == state->grid_height - 1)
+             if (state->cursor_y == rows - 1)
                scroll (state);
              else
                state->cursor_y++;
@@ -1101,6 +1196,8 @@ print_char (p_state *state, int c)
        }
       else
        {
+          /* #### This should do UTF-8 decoding */
+
          cell->state = FLARE;
          cell->p_char = state->chars[c];
          cell->changed = True;
@@ -1109,10 +1206,10 @@ print_char (p_state *state, int c)
          if (c != ' ' && cell->p_char->blank_p)
            cell->p_char = state->chars[CURSOR_INDEX];
 
-         if (state->cursor_x >= state->grid_width - 1)
+         if (state->cursor_x >= cols - 1)
            {
              state->cursor_x = 0;
-             if (state->cursor_y >= state->grid_height - 1)
+             if (state->cursor_y >= rows - 1)
                scroll (state);
              else
                state->cursor_y++;
index 878f5b9b6996ffdad0a49e2333f31a5599634387..08ec7a753d9c84dd8c2a6accab19ac5b607c8ecd 100644 (file)
@@ -236,7 +236,9 @@ pixack_frame(struct state *st, char *pix_buf)
       /* John E. Pearson "Complex Patterns in a Simple System"
         Science, July 1993 */
 
-      uvv = (((r1 * r2) >> bps) * r2) >> bps;
+      /* uvv = (((r1 * r2) >> bps) * r2) >> bps; */
+      /* avoid signed integer overflow */
+      uvv = ((((r1 >> 1)* r2) >> bps) * r2) >> (bps - 1);
       switch (st->reaction) {  /* costs 4% */
       case 0:
        r1 += 4 * (((28 * (mx-r1)) >> 10) - uvv);
diff --git a/hacks/recanim.c b/hacks/recanim.c
new file mode 100644 (file)
index 0000000..f8a3dd5
--- /dev/null
@@ -0,0 +1,319 @@
+/* recanim, Copyright (c) 2014 Jamie Zawinski <jwz@jwz.org>
+ * Record animation frames of the running screenhack.
+ *
+ * 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 /* HAVE_CONFIG_H */
+
+#ifdef USE_GL
+# ifdef HAVE_COCOA
+#  include "jwxyz.h"
+# else /* !HAVE_COCOA -- real Xlib */
+#  include <GL/glx.h>
+#  include <GL/glu.h>
+# endif /* !HAVE_COCOA */
+# ifdef HAVE_JWZGLES
+#  include "jwzgles.h"
+# endif /* HAVE_JWZGLES */
+#endif /* USE_GL */
+
+#ifdef HAVE_GDK_PIXBUF
+# ifdef HAVE_GTK2
+#  include <gdk-pixbuf-xlib/gdk-pixbuf-xlib.h>
+# else  /* !HAVE_GTK2 */
+#  include <gdk-pixbuf/gdk-pixbuf-xlib.h>
+# endif /* !HAVE_GTK2 */
+#endif /* HAVE_GDK_PIXBUF */
+
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include "screenhackI.h"
+#include "recanim.h"
+
+struct record_anim_state {
+  Screen *screen;
+  Window window;
+  int frame_count;
+  int target_frames;
+  XWindowAttributes xgwa;
+  char *title;
+  int pct;
+# ifdef USE_GL
+  char *data, *data2;
+# else  /* !USE_GL */
+  XImage *img;
+  Pixmap p;
+  GC gc;
+# endif /* !USE_GL */
+};
+
+record_anim_state *
+screenhack_record_anim_init (Screen *screen, Window window, int target_frames)
+{
+  Display *dpy = DisplayOfScreen (screen);
+  record_anim_state *st;
+
+# ifndef USE_GL
+  XGCValues gcv;
+# endif /* !USE_GL */
+
+  if (target_frames <= 0) return 0;
+
+  st = (record_anim_state *) calloc (1, sizeof(*st));
+
+  st->screen = screen;
+  st->window = window;
+  st->target_frames = target_frames;
+  st->frame_count = 0;
+
+# ifdef HAVE_GDK_PIXBUF
+  {
+    Window root;
+    int x, y;
+    unsigned int w, h, d, bw;
+    XGetGeometry (dpy, window, &root, &x, &y, &w, &h, &bw, &d);
+    gdk_pixbuf_xlib_init_with_depth (dpy, screen_number (screen), d);
+
+#  ifdef HAVE_GTK2
+#   if !GLIB_CHECK_VERSION(2, 36 ,0)
+    g_type_init();
+#   endif
+#  else  /* !HAVE_GTK2 */
+    xlib_rgb_init (dpy, screen);
+#  endif /* !HAVE_GTK2 */
+  }
+# else  /* !HAVE_GDK_PIXBUF */
+#  error GDK_PIXBUF is required
+# endif /* !HAVE_GDK_PIXBUF */
+
+  XGetWindowAttributes (dpy, st->window, &st->xgwa);
+
+# ifdef USE_GL
+
+  st->data  = (char *) calloc (st->xgwa.width, st->xgwa.height * 3);
+  st->data2 = (char *) calloc (st->xgwa.width, st->xgwa.height * 3);
+
+# else    /* !USE_GL */
+
+  st->gc = XCreateGC (dpy, st->window, 0, &gcv);
+  st->p = XCreatePixmap (dpy, st->window,
+                         st->xgwa.width, st->xgwa.height, st->xgwa.depth);
+  st->img = XCreateImage (dpy, st->xgwa.visual, st->xgwa.depth, ZPixmap,
+                          0, 0, st->xgwa.width, st->xgwa.height, 8, 0);
+  st->img->data = (char *) calloc (st->img->height, st->img->bytes_per_line);
+# endif /* !USE_GL */
+
+
+# ifndef HAVE_COCOA
+  XFetchName (dpy, st->window, &st->title);
+# endif /* !HAVE_COCOA */
+
+  return st;
+}
+
+
+void
+screenhack_record_anim (record_anim_state *st)
+{
+  int bytes_per_line = st->xgwa.width * 3;
+
+# ifndef USE_GL
+
+  Display *dpy = DisplayOfScreen (st->screen);
+  char *data = (char *) st->img->data;
+
+  /* Under XQuartz we can't just do XGetImage on the Window, we have to
+     go through an intermediate Pixmap first.  I don't understand why.
+     Also, the fucking resize handle shows up as black.  God dammit.
+     A workaround for that is to temporarily remove /opt/X11/bin/quartz-wm
+   */
+  XCopyArea (dpy, st->window, st->p, st->gc, 0, 0,
+             st->xgwa.width, st->xgwa.height, 0, 0);
+  XGetSubImage (dpy, st->p, 0, 0, st->xgwa.width, st->xgwa.height,
+                ~0L, ZPixmap, st->img, 0, 0);
+
+  /* Convert BGRA to RGB */
+  {
+    const char *in = st->img->data;
+    char *out = st->img->data;
+    int x, y;
+    int w = st->img->width;
+    int h = st->img->height;
+    for (y = 0; y < h; y++)
+      {
+        const char *in2 = in;
+        for (x = 0; x < w; x++)
+          {
+            *out++ = in2[2];
+            *out++ = in2[1];
+            *out++ = in2[0];
+            in2 += 4;
+          }
+        in += st->img->bytes_per_line;
+      }
+  }
+# else  /* USE_GL */
+
+  char *data = st->data2;
+  int y;
+
+# ifdef HAVE_JWZGLES
+#  undef glReadPixels /* Kludge -- unimplemented in the GLES compat layer */
+# endif
+
+  /* First OpenGL frame tends to be random data like a shot of my desktop,
+     since it is the front buffer when we were drawing in the back buffer.
+     Leave it black. */
+  /* glDrawBuffer (GL_BACK); */
+  if (st->frame_count != 0)
+    glReadPixels (0, 0, st->xgwa.width, st->xgwa.height,
+                  GL_RGB, GL_UNSIGNED_BYTE, st->data);
+
+  /* Flip vertically */
+  for (y = 0; y < st->xgwa.height; y++)
+    memcpy (data      + bytes_per_line * y,
+            st->data  + bytes_per_line * (st->xgwa.height - y - 1),
+            bytes_per_line);
+
+# endif /* USE_GL */
+
+
+# ifdef HAVE_GDK_PIXBUF
+  {
+    const char *type = "png";
+    char fn[1024];
+    GError *error = 0;
+    GdkPixbuf *pixbuf;
+
+    pixbuf = gdk_pixbuf_new_from_data ((guchar *) data,
+                                       GDK_COLORSPACE_RGB, False, /* alpha */
+                                       8, /* bits per sample */
+                                       st->xgwa.width, st->xgwa.height,
+                                       bytes_per_line,
+                                       0, 0);
+
+    sprintf (fn, "%s-%06d.%s", progname, st->frame_count, type);
+    gdk_pixbuf_save (pixbuf, fn, type, &error, NULL);
+
+    if (error)
+      {
+        fprintf (stderr, "%s: %s: %s\n", progname, fn, error->message);
+        exit (1);
+      }
+
+    g_object_unref (pixbuf);
+  }
+# else  /* !HAVE_GDK_PIXBUF */
+#  error GDK_PIXBUF is required
+# endif /* !HAVE_GDK_PIXBUF */
+
+# ifndef HAVE_COCOA
+  {  /* Put percent done in window title */
+    int pct = 100 * (st->frame_count + 1) / st->target_frames;
+    if (pct != st->pct && st->title)
+      {
+        Display *dpy = DisplayOfScreen (st->screen);
+        char *t2 = (char *) malloc (strlen(st->title) + 20);
+        sprintf (t2, "%s: %d%%", st->title, pct);
+        XStoreName (dpy, st->window, t2);
+        XSync (dpy, 0);
+        free (t2);
+        st->pct = pct;
+      }
+  }
+# endif /* !HAVE_COCOA */
+
+  if (++st->frame_count >= st->target_frames)
+    screenhack_record_anim_free (st);
+}
+
+
+void
+screenhack_record_anim_free (record_anim_state *st)
+{
+# ifndef USE_GL
+  Display *dpy = DisplayOfScreen (st->screen);
+# endif /* !USE_GL */
+
+  struct stat s;
+  int i;
+  const char *type = "png";
+  char cmd[1024];
+  char fn[1024];
+  const char *soundtrack = 0;
+
+  fprintf (stderr, "%s: wrote %d frames\n", progname, st->frame_count);
+
+# ifdef USE_GL
+  free (st->data);
+  free (st->data2);
+# else  /* !USE_GL */
+  free (st->img->data);
+  st->img->data = 0;
+  XDestroyImage (st->img);
+  XFreeGC (dpy, st->gc);
+  XFreePixmap (dpy, st->p);
+# endif /* !USE_GL */
+
+  sprintf (fn, "%s.%s", progname, "mp4");
+  unlink (fn);
+
+# define ST "images/drives-200.mp3"
+  soundtrack = ST;
+  if (stat (soundtrack, &s)) soundtrack = 0;
+  if (! soundtrack) soundtrack = "../" ST;
+  if (stat (soundtrack, &s)) soundtrack = 0;
+  if (! soundtrack) soundtrack = "../../" ST;
+  if (stat (soundtrack, &s)) soundtrack = 0;
+
+  sprintf (cmd,
+           "ffmpeg"
+           " -r 30"   /* Must be before -i */
+           " -framerate 30"
+           " -i '%s-%%06d.%s'",
+           progname, type);
+  if (soundtrack)
+    sprintf (cmd + strlen(cmd),
+             " -i '%s' -map 0:v:0 -map 1:a:0 -acodec libfaac",
+             soundtrack);
+  sprintf (cmd + strlen(cmd),
+           " -c:v libx264"
+           " -profile:v high"
+           " -crf 18"
+           " -pix_fmt yuv420p"
+           " '%s'"
+           " 2>&-",
+           fn);
+  fprintf (stderr, "%s: exec: %s\n", progname, cmd);
+  system (cmd);
+
+  if (stat (fn, &s))
+    {
+      fprintf (stderr, "%s: %s was not created\n", progname, fn);
+      exit (1);
+    }
+
+  fprintf (stderr, "%s: wrote %s (%.1f MB)\n", progname, fn,
+           s.st_size / (float) (1024 * 1024));
+
+  for (i = 0; i < st->frame_count; i++)
+    {
+      sprintf (fn, "%s-%06d.%s", progname, i, type);
+      unlink (fn);
+    }
+
+  if (st->title)
+    free (st->title);
+  free (st);
+  exit (0);
+}
diff --git a/hacks/recanim.h b/hacks/recanim.h
new file mode 100644 (file)
index 0000000..acb1b92
--- /dev/null
@@ -0,0 +1,27 @@
+/* recanim, Copyright (c) 2014 Jamie Zawinski <jwz@jwz.org>
+ * Record animation frames of the running screenhack.
+ *
+ * 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_RECORD_ANIM_H__
+# define __XSCREENSAVER_RECORD_ANIM_H__
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+typedef struct record_anim_state record_anim_state;
+
+extern record_anim_state *screenhack_record_anim_init (Screen *, Window,
+                                                       int frames);
+extern void screenhack_record_anim (record_anim_state *);
+extern void screenhack_record_anim_free (record_anim_state *);
+
+#endif /* __XSCREENSAVER_RECORD_ANIM_H__ */
index 8acf707d1b63858666a1c8f44fa74d2d46664102..76586488be5900b1fea18bba359c48f6cdbb06e1 100644 (file)
@@ -533,7 +533,7 @@ setup_X(struct state *st)
 
     st->img_loader = load_image_async_simple (0, xgwa.screen, st->window,
                                               st->window, 0, 0);
-    st->start_time = time ((time_t) 0);
+    st->start_time = time ((time_t *) 0);
   } else {
     XGCValues gcv;
 
@@ -1033,7 +1033,7 @@ ripples_draw (Display *dpy, Window window, void *closure)
       if (! st->img_loader) {  /* just finished */
         XWindowAttributes xgwa;
         XGetWindowAttributes(st->dpy, st->window, &xgwa);
-        st->start_time = time ((time_t) 0);
+        st->start_time = time ((time_t *) 0);
         st->orig_map = XGetImage (st->dpy, st->window, 0, 0, 
                                   xgwa.width, xgwa.height,
                                   ~0L, ZPixmap);
@@ -1043,12 +1043,12 @@ ripples_draw (Display *dpy, Window window, void *closure)
     }
 
     if (!st->img_loader &&
-        st->start_time + st->duration < time ((time_t) 0)) {
+        st->start_time + st->duration < time ((time_t *) 0)) {
       XWindowAttributes xgwa;
       XGetWindowAttributes(st->dpy, st->window, &xgwa);
       st->img_loader = load_image_async_simple (0, xgwa.screen, st->window,
                                                 st->window, 0, 0);
-      st->start_time = time ((time_t) 0);
+      st->start_time = time ((time_t *) 0);
       return st->delay;
     }
 
index c32c1d578b0a839c4d34b587a7525a603847aa4d..3ccb4668eb456cb88335d8f67630b26217fc8293 100644 (file)
@@ -325,7 +325,7 @@ init_hack (struct state *st)
 {
   int i;
 
-  st->start_time = time ((time_t) 0);
+  st->start_time = time ((time_t *) 0);
   st->zoom_box = calloc (st->num_zoom, sizeof (struct zoom_area *));
   for (i = 0; i < st->num_zoom; i++) {
     st->zoom_box[i] = create_zoom (st);
@@ -358,12 +358,12 @@ rotzoomer_draw (Display *disp, Window win, void *closure)
     }
 
   if (!st->img_loader &&
-      st->start_time + st->duration < time ((time_t) 0)) {
+      st->start_time + st->duration < time ((time_t *) 0)) {
     XWindowAttributes xgwa;
     XGetWindowAttributes(st->dpy, st->window, &xgwa);
     st->img_loader = load_image_async_simple (0, xgwa.screen, st->window,
                                               st->window, 0, 0);
-    st->start_time = time ((time_t) 0);
+    st->start_time = time ((time_t *) 0);
     return st->delay;
   }
 
@@ -486,7 +486,7 @@ rotzoomer_init (Display *dpy, Window window)
     st->sweep = 0;
   }
 
-  st->start_time = time ((time_t) 0);
+  st->start_time = time ((time_t *) 0);
 
   setup_X (st);
 
index 7199c77bc879aa703652f739804fe003ae0084be..0b5a1b604d9d5f8acf266c55ccf6ceec2b0e141d 100644 (file)
 #include "vroot.h"
 #include "fps.h"
 
+#ifdef HAVE_RECORD_ANIM
+# include "recanim.h"
+#endif
+
 #ifndef _XSCREENSAVER_VROOT_H_
 # error Error!  You have an old version of vroot.h!  Check -I args.
 #endif /* _XSCREENSAVER_VROOT_H_ */
@@ -148,6 +152,11 @@ static XrmOptionDescRec default_options [] = {
 # ifdef DEBUG_PAIR
   { "-pair",   ".pair",                XrmoptionNoArg, "True" },
 # endif /* DEBUG_PAIR */
+
+# ifdef HAVE_RECORD_ANIM
+  { "-record-animation", ".recordAnim", XrmoptionSepArg, 0 },
+# endif /* HAVE_RECORD_ANIM */
+
   { 0, 0, 0, 0 }
 };
 
@@ -477,15 +486,23 @@ usleep_and_process_events (Display *dpy,
                          , Window window2, fps_state *fpst2, void *closure2,
                            unsigned long delay2
 #endif
+# ifdef HAVE_RECORD_ANIM
+                         , record_anim_state *anim_state
+# endif
                            )
 {
   do {
-    unsigned long quantum = 100000;  /* 1/10th second */
+    unsigned long quantum = 33333;  /* 30 fps */
     if (quantum > delay) 
       quantum = delay;
     delay -= quantum;
 
     XSync (dpy, False);
+
+#ifdef HAVE_RECORD_ANIM
+    if (anim_state) screenhack_record_anim (anim_state);
+#endif
+
     if (quantum > 0)
       {
         usleep (quantum);
@@ -520,6 +537,9 @@ run_screenhack_table (Display *dpy,
                       Window window,
 # ifdef DEBUG_PAIR
                       Window window2,
+# endif
+# ifdef HAVE_RECORD_ANIM
+                      record_anim_state *anim_state,
 # endif
                       const struct xscreensaver_function_table *ft)
 {
@@ -565,11 +585,19 @@ run_screenhack_table (Display *dpy,
                                        window, fpst, closure, delay
 #ifdef DEBUG_PAIR
                                        , window2, fpst2, closure2, delay2
+#endif
+#ifdef HAVE_RECORD_ANIM
+                                       , anim_state
 #endif
                                        ))
         break;
     }
 
+#ifdef HAVE_RECORD_ANIM
+  /* Exiting before target frames hit: write the video anyway. */
+  if (anim_state) screenhack_record_anim_free (anim_state);
+#endif
+
   ft->free_cb (dpy, window, closure);
   if (fpst) fps_free (fpst);
 
@@ -677,6 +705,9 @@ main (int argc, char **argv)
   Window window2 = 0;
   Widget toplevel2 = 0;
 # endif
+#ifdef HAVE_RECORD_ANIM
+  record_anim_state *anim_state = 0;
+#endif
   XtAppContext app;
   Bool root_p;
   Window on_window = 0;
@@ -922,12 +953,28 @@ main (int argc, char **argv)
 # undef ya_rand_init
   ya_rand_init (0);
 
+
+#ifdef HAVE_RECORD_ANIM
+  {
+    int frames = get_integer_resource (dpy, "recordAnim", "Integer");
+    if (frames > 0)
+      anim_state = screenhack_record_anim_init (xgwa.screen, window, frames);
+  }
+#endif
+
   run_screenhack_table (dpy, window, 
 # ifdef DEBUG_PAIR
                         window2,
+# endif
+# ifdef HAVE_RECORD_ANIM
+                        anim_state,
 # endif
                         ft);
 
+#ifdef HAVE_RECORD_ANIM
+  if (anim_state) screenhack_record_anim_free (anim_state);
+#endif
+
   XtDestroyWidget (toplevel);
   XtDestroyApplicationContext (app);
 
index 4f55c943890cea2815e7e5910d8648603d9396a2..b5a1709f1038561be77833d5f58fce3e4e712636 100644 (file)
@@ -67,9 +67,9 @@
 # include <values.h>
 #endif
 
-#ifdef HAVE_COCOA
+#if defined(HAVE_COCOA) || defined(HAVE_ANDROID)
 # include "jwxyz.h"
-#else  /* !HAVE_COCOA -- real X11 */
+#else  /* real X11 */
 # include <X11/Xlib.h>
 # include <X11/Xutil.h>
 # include <X11/Xresource.h>
index bff002cb8ce3e6838e26e26c120b0fe37adcc7c1..4ba8b7ff42a229bca254da293ca1c0c2df202709 100644 (file)
@@ -55,7 +55,7 @@ slidescreen_init (Display *dpy, Window window)
   XGetWindowAttributes (st->dpy, st->window, &xgwa);
   st->img_loader = load_image_async_simple (0, xgwa.screen, st->window,
                                             st->window, 0, 0);
-  st->start_time = time ((time_t) 0);
+  st->start_time = time ((time_t *) 0);
 
   st->max_width = xgwa.width;
   st->max_height = xgwa.height;
@@ -307,19 +307,19 @@ slidescreen_draw (Display *dpy, Window window, void *closure)
     {
       st->img_loader = load_image_async_simple (st->img_loader, 0, 0, 0, 0, 0);
       if (! st->img_loader) {  /* just finished */
-        st->start_time = time ((time_t) 0);
+        st->start_time = time ((time_t *) 0);
         draw_grid (st);
       }
       return st->delay;
     }
 
   if (!st->img_loader &&
-      st->start_time + st->duration < time ((time_t) 0)) {
+      st->start_time + st->duration < time ((time_t *) 0)) {
     XWindowAttributes xgwa;
     XGetWindowAttributes(st->dpy, st->window, &xgwa);
     st->img_loader = load_image_async_simple (0, xgwa.screen, st->window,
                                               st->window, 0, 0);
-    st->start_time = time ((time_t) 0);
+    st->start_time = time ((time_t *) 0);
     st->draw_initted = 0;
     return st->delay;
   }
@@ -433,7 +433,7 @@ slidescreen_reshape (Display *dpy, Window window, void *closure,
     XGetWindowAttributes (st->dpy, st->window, &xgwa);
     st->img_loader = load_image_async_simple (0, xgwa.screen, st->window,
                                               st->window, 0, 0);
-    st->start_time = time ((time_t) 0);
+    st->start_time = time ((time_t *) 0);
   }
 }
 
index a47e55c746fc1c410f1dfc24488fd7ff343a39ec..61f996d15fd2cc0c846915c2ad1941c1e0c780c1 100644 (file)
@@ -22,6 +22,7 @@
 
 /* #define DEBUG */
 #include <math.h>
+#include <limits.h>
 #include "screenhack.h"
 
 #define MINX 0.0
@@ -73,13 +74,15 @@ static long
 currentTimeInMs(struct state *st)
 {
   struct timeval curTime;
+  unsigned long ret_unsigned;
 #ifdef GETTIMEOFDAY_TWO_ARGS
   struct timezone tz = {0,0};
   gettimeofday(&curTime, &tz);
 #else
   gettimeofday(&curTime);
 #endif
-  return curTime.tv_sec*1000 + curTime.tv_usec/1000.0;
+  ret_unsigned = curTime.tv_sec *1000U + curTime.tv_usec / 1000;
+  return (ret_unsigned <= LONG_MAX) ? ret_unsigned : -1 - (long)(ULONG_MAX - ret_unsigned);
 }
 
 
@@ -155,7 +158,7 @@ spotlight_init (Display *dpy, Window window)
   clip_pm = XCreatePixmap(st->dpy, st->window, st->radius*4, st->radius*4, 1);
   st->img_loader = load_image_async_simple (0, xgwa.screen, st->window, st->pm,
                                             0, 0);
-  st->start_time = time ((time_t) 0);
+  st->start_time = time ((time_t *) 0);
 
   gcv.foreground = 0L;
   clip_gc = XCreateGC(st->dpy, clip_pm, gcflags, &gcv);
@@ -197,18 +200,19 @@ static void
 onestep (struct state *st, Bool first_p)
 {
   long now;
+  unsigned long now_unsigned;
 
   if (st->img_loader)   /* still loading */
     {
       st->img_loader = load_image_async_simple (st->img_loader, 0, 0, 0, 0, 0);
       if (! st->img_loader) {  /* just finished */
-        st->start_time = time ((time_t) 0);
+        st->start_time = time ((time_t *) 0);
       }
       return;
     }
 
   if (!st->img_loader &&
-      st->start_time + st->duration < time ((time_t) 0)) {
+      st->start_time + st->duration < time ((time_t *) 0)) {
     st->img_loader = load_image_async_simple (0, st->screen, st->window,
                                               st->pm, 0, 0);
     return;
@@ -221,7 +225,8 @@ onestep (struct state *st, Bool first_p)
 
   st->s = st->radius *4 ;   /* s = width of buffer */
 
-  now = currentTimeInMs(st) + st->off;
+  now_unsigned = (unsigned long) currentTimeInMs(st) + st->off;
+  now = (now_unsigned <= LONG_MAX) ? now_unsigned : -1 - (long)(ULONG_MAX - now_unsigned);
 
   /* find new x,y */
   st->x = ((1 + sin(((double)now) / X_PERIOD * 2. * M_PI))/2.0) 
index 6cfee31db8ddcb89a46fdb174cfd36c180056e53..103dd13d6d90fadd012cdbe02c2a81151fdfe539 100644 (file)
@@ -469,8 +469,8 @@ starfish_draw (Display *dpy, Window window, void *closure)
   if (st->duration > 0)
     {
       if (st->start_time == 0)
-        st->start_time = time ((time_t) 0);
-      now = time ((time_t) 0);
+        st->start_time = time ((time_t *) 0);
+      now = time ((time_t *) 0);
       if (st->start_time + st->duration < now)
         {
           st->start_time = now;
index efe11fc55762e117b8fad1768f208aa8be4fc208..52d031cc032804d5beb46e98ceee641569fd4d2b 100644 (file)
@@ -122,6 +122,7 @@ struct field {
     unsigned int cycles;
 
     unsigned int wireframe;
+    unsigned int seamless;
 };
 
 struct state {
@@ -164,6 +165,7 @@ static struct field
     f->parsedcolors = NULL;
     f->cycles = 0;
     f->wireframe = 0;
+    f->seamless = 0;
     f->fgcolor = 0;
     f->bgcolor = 0;
     f->visdepth = 0;
@@ -398,6 +400,10 @@ region_color(struct state *st, GC fgc, struct field *f, crack *cr)
 
         cx = (int) rx;
         cy = (int) ry;
+        if (f->seamless) {
+            cx %= f->width;
+            cy %= f->height;
+        }
 
         if ((cx >= 0) && (cx < f->width) && (cy >= 0) && (cy < f->height)) {
             /* safe to check */
@@ -431,6 +437,10 @@ region_color(struct state *st, GC fgc, struct field *f, crack *cr)
     for (i = 0; i < grains; i++) {
         drawx = (cr->x + (rx - cr->x) * sin(cr->sandp + sin((float) i * w)));
         drawy = (cr->y + (ry - cr->y) * sin(cr->sandp + sin((float) i * w)));
+        if (f->seamless) {
+            drawx = fmod(drawx + f->width, f->width);
+            drawy = fmod(drawy + f->height, f->height);
+        }
 
         /* Draw sand bit */
         c = trans_point(st, drawx, drawy, cr->sandcolor, (0.1 - i / (grains * 10.0)), f);
@@ -502,12 +512,19 @@ movedrawcrack(struct state *st, GC fgc, struct field *f, int cracknum)
         cr->t += cr->t_inc;
         cr->degrees_drawn += abs(cr->t_inc);
     }
+    if (f->seamless) {
+        cr->x = fmod(cr->x + f->width, f->width);
+        cr->y = fmod(cr->y + f->height, f->height);
+    }
 
     /* bounds check */
     /* modification of random(-0.33,0.33) */
     cx = (int) (cr->x + (frand(0.66) - 0.33));
     cy = (int) (cr->y + (frand(0.66) - 0.33));
-
+    if (f->seamless) {
+        cx %= f->width;
+        cy %= f->height;
+    }
 
     if ((cx >= 0) && (cx < f->width) && (cy >= 0) && (cy < f->height)) {
         /* draw sand painter if we're not wireframe */
@@ -580,6 +597,7 @@ substrate_init (Display *dpy, Window window)
     st->f->wireframe = (get_boolean_resource(st->dpy, "wireFrame", "Boolean"));
     st->f->grains = (get_integer_resource(st->dpy, "sandGrains", "Integer"));
     st->f->circle_percent = (get_integer_resource(st->dpy, "circlePercent", "Integer"));
+    st->f->seamless = (get_boolean_resource(st->dpy, "seamless", "Boolean"));
 
     if (st->f->initial_cracks <= 2) {
         fprintf(stderr, "%s: Initial cracks must be greater than 2\n", progname);
@@ -720,6 +738,7 @@ static const char *substrate_defaults[] = {
     ".foreground: black",
     "*fpsSolid:        true",
     "*wireFrame: false",
+    "*seamless: false",
     "*maxCycles: 10000",
     "*growthDelay: 18000",
     "*initialCracks: 3",
@@ -736,6 +755,7 @@ static XrmOptionDescRec substrate_options[] = {
     {"-background", ".background", XrmoptionSepArg, 0},
     {"-foreground", ".foreground", XrmoptionSepArg, 0},
     {"-wireframe", ".wireFrame", XrmoptionNoArg, "true"},
+    {"-seamless", ".seamless", XrmoptionNoArg, "true"},
     {"-max-cycles", ".maxCycles", XrmoptionSepArg, 0},
     {"-growth-delay", ".growthDelay", XrmoptionSepArg, 0},
     {"-initial-cracks", ".initialCracks", XrmoptionSepArg, 0},
index b930622093a04acad585260bd4e2602ae7c80696..d018f0cde4927ec531a693d815c401e0dc98049e 100644 (file)
@@ -543,6 +543,9 @@ tessellate (struct state *st)
       st->pgc = XCreateGC(st->dpy, st->image, GCFunction, &gcv);
     }
 
+  if (! st->nthreshes) return;
+
+
   /* If duration2 has expired, switch to the next threshold. */
 
   if (! st->button_down_p)
@@ -856,6 +859,14 @@ tessellimage_draw (Display *dpy, Window window, void *closure)
                0, 0, st->delta->width, st->delta->height, 
                (st->xgwa.width  - st->delta->width)  / 2,
                (st->xgwa.height - st->delta->height) / 2);
+  else if (!st->nthreshes)
+    XCopyArea (st->dpy,
+               st->image,
+               st->window, st->wgc,
+               0, 0, st->xgwa.width, st->xgwa.height,
+               0,
+               0);
+
 
  DONE:
   return st->delay;
index a9e2be3cf0b0eb8182e174b16302ccc00990243b..cc30b002a6740de4f3e985d0caa53563f9b2f2a7 100644 (file)
@@ -107,14 +107,24 @@ struct state {
 static void
 grabImage_start (struct state *st, XWindowAttributes *xwa)
 {
+    Pixmap p;
+    GC gc;
+    XGCValues gcv;
     XFillRectangle (st->dpy, st->window, st->backgroundGC, 0, 0, 
                    st->windowWidth, st->windowHeight);
 
+    p = XCreatePixmap (st->dpy, st->window,
+                       xwa->width, xwa->height, xwa->depth);
+    gc = XCreateGC (st->dpy, st->window, 0, &gcv);
+    XCopyArea (st->dpy, st->window, p, gc, 0, 0,
+               xwa->width, xwa->height, 0, 0);
     st->backgroundImage = 
-       XGetImage (st->dpy, st->window, 0, 0, st->windowWidth, st->windowHeight,
+       XGetImage (st->dpy, p, 0, 0, st->windowWidth, st->windowHeight,
                   ~0L, ZPixmap);
+    XFreeGC (st->dpy, gc);
+    XFreePixmap (st->dpy, p);
 
-    st->start_time = time ((time_t) 0);
+    st->start_time = time ((time_t *) 0);
     st->img_loader = load_image_async_simple (0, xwa->screen, st->window,
                                               st->window, 0, 0);
 }
@@ -125,7 +135,7 @@ grabImage_done (struct state *st)
     XWindowAttributes xwa;
     XGetWindowAttributes (st->dpy, st->window, &xwa);
 
-    st->start_time = time ((time_t) 0);
+    st->start_time = time ((time_t *) 0);
     if (st->sourceImage) XDestroyImage (st->sourceImage);
     st->sourceImage = XGetImage (st->dpy, st->window, 0, 0, st->windowWidth, st->windowHeight,
                             ~0L, ZPixmap);
@@ -616,7 +626,7 @@ twang_draw (Display *dpy, Window window, void *closure)
     }
 
   if (!st->img_loader &&
-      st->start_time + st->duration < time ((time_t) 0)) {
+      st->start_time + st->duration < time ((time_t *) 0)) {
     XWindowAttributes xgwa;
     XGetWindowAttributes (st->dpy, st->window, &xgwa);
     grabImage_start (st, &xgwa);
index 6aea5f25405b497b0ff3cd75c5e9304a0988614a..cce26c88d8d77909162bc31295f41ade54fdb83b 100755 (executable)
@@ -57,7 +57,7 @@ use bytes;
 
 
 my $progname = $0; $progname =~ s@.*/@@g;
-my ($version) = ('$Revision: 1.165 $' =~ m/\s(\d[.\d]+)\s/s);
+my ($version) = ('$Revision: 1.167 $' =~ m/\s(\d[.\d]+)\s/s);
 my $copyright = "WebCollage $version, Copyright (c) 1999-2014" .
     " Jamie Zawinski <jwz\@jwz.org>\n" .
     "            http://www.jwz.org/webcollage/\n";
@@ -244,6 +244,7 @@ my %warningless_sites = (
   "yandex.ru"               => 1,
   "imgur.com"               => 1,
   "yfrog.com"               => 1,
+  "cdninstagram.com"        => 1,
 
   "yimg.com"                => 1,  # This is where dailynews.yahoo.com stores
   "eimg.com"                => 1,  # its images, so pick_from_yahoo_news_text()
@@ -2239,18 +2240,39 @@ sub pick_from_flickr_random($) {
 \f
 ############################################################################
 #
-# Pick random images from Instagram, via gramfeed.com's key.
+# Pick random images from Instagram.
 #
 ############################################################################
 
-my $instagram_url_base = "https://api.instagram.com/v1/media/popular" .
-                        "?client_id=b59fbe4563944b6c88cced13495c0f49";
+my $instagram_url_base = "https://api.instagram.com/v1/media/popular";
 
 # instagram_random
 sub pick_from_instagram($) {
   my $timeout = shift;
 
-  $last_search = $instagram_url_base;
+  # Liberated access tokens.
+  # jsdo.it search for: instagram client_id
+  # Google search for: instagram "&client_id=" site:jsfiddle.net
+  my @tokens = ('b59fbe4563944b6c88cced13495c0f49', # gramfeed.com
+                'fa26679250df49c48a33fbcf30aae989', # instac.at
+                'd9494686198d4dfeb954979a3e270e5e', # iconosquare.com
+                '793ef48bb18e4197b61afce2d799b81c', # jsdo.it
+                '67b8a3e0073449bba70600d0fc68e6cb', # jsdo.it
+                '26a098e0df4d4b9ea8b4ce6c505b7742', # jsdo.it
+                '2437cbcd906a4c10940f990d283d3cd5', # jsdo.it
+                '191c7d7d5312464cbd92134f36ffdab5', # jsdo.it
+                'acfec809437b4340b2c38f66503af774', # jsdo.it
+                'e9f77604a3a24beba949c12d18130988', # jsdo.it
+                '2cd7bcf68ae346529770073d311575b3', # jsdo.it
+                '830c600fe8d742e2ab3f3b94f9bb22b7', # jsdo.it
+                '55865a0397ad41e5997dd95ef4df8da1', # jsdo.it
+                '192a5742f3644ea8bed1d25e439286a8', # jsdo.it
+                '38ed1477e7a44595861b8842cdb8ba23', # jsdo.it
+                'e52f79f645f54488ad0cc47f6f55ade6', # jsfiddle.net
+                );
+
+  my $tok = $tokens[int(rand($#tokens+1))];
+  $last_search = $instagram_url_base . "?client_id=" . $tok;
 
   print STDERR "\n\n" if ($verbose_load);
   LOG ($verbose_load, "URL: $last_search");
@@ -2835,8 +2857,9 @@ sub image_size($) {
 sub which($) {
   my ($prog) = @_;
   foreach (split (/:/, $ENV{PATH})) {
-    if (-x "$_/$prog") {
-      return $prog;
+    my $path = "$_/$prog";
+    if (-x $path) {
+      return $path;
     }
   }
   return undef;
@@ -2896,15 +2919,17 @@ sub url_only_output() {
 #
 ##############################################################################
 
-my $image_ppm   = sprintf ("%s/webcollage-%08x.ppm",
-                           ($ENV{TMPDIR} ? $ENV{TMPDIR} : "/tmp"),
-                           rand(0xFFFFFFFF));
-my $image_tmp1  = sprintf ("%s/webcollage-1-%08x.ppm",
-                           ($ENV{TMPDIR} ? $ENV{TMPDIR} : "/tmp"),
-                           rand(0xFFFFFFFF));
-my $image_tmp2  = sprintf ("%s/webcollage-2-%08x.ppm",
-                           ($ENV{TMPDIR} ? $ENV{TMPDIR} : "/tmp"),
-                           rand(0xFFFFFFFF));
+my ($image_ppm, $image_tmp1, $image_tmp2);
+{
+  my $seed = rand(0xFFFFFFFF);
+  $image_ppm = sprintf ("%s/webcollage-%08x",
+                        ($ENV{TMPDIR} ? $ENV{TMPDIR} : "/tmp"),
+                        $seed);
+  $image_tmp1 = $image_ppm . '-1.ppm';
+  $image_tmp2 = $image_ppm . '-2.ppm';
+  $image_ppm .= '.ppm';
+}
+
 
 my $filter_cmd = undef;
 my $post_filter_cmd = undef;
@@ -3111,11 +3136,22 @@ my $ppm_to_root_window_cmd = undef;
 sub x_or_pbm_output($) {
   my ($window_id) = @_;
 
+  # Adjust the PATH for OS X 10.10.
+  #
+  $_ = $0;
+  s:/[^/]*$::;
+  s/([^a-zA-Z0-9._\-+\/])/\\$1/g;
+  $ENV{PATH} = "$_:$ENV{PATH}";
+
   # Check for our helper program, to see whether we need to use PPM pipelines.
   #
   $_ = "webcollage-helper";
-  if (defined ($webcollage_helper) || which ($_)) {
-    $webcollage_helper = $_ unless (defined($webcollage_helper));
+
+  if (! defined ($webcollage_helper)) {
+    $webcollage_helper = which ($_);
+  }
+
+  if (defined ($webcollage_helper)) {
     LOG ($verbose_pbm, "found \"$webcollage_helper\"");
     $webcollage_helper .= " -v";
   } else {
@@ -3142,6 +3178,16 @@ sub x_or_pbm_output($) {
     which ($_) || error "$_ not found on \$PATH.";
   }
 
+  # If we're using webcollage-helper and not a filter, then the tmp files
+  # are JPEGs, not PPMs.
+  #
+  if (defined ($webcollage_helper) && !defined ($filter_cmd)) {
+    foreach ($image_ppm, $image_tmp1, $image_tmp2) {
+      s/\.ppm$/.jpg/s;
+    }
+  }
+
+
   # find a root-window displayer program.
   #
   if (!$no_output_p) {
@@ -3310,6 +3356,14 @@ sub paste_image($$$$) {
       return 0;
     }
 
+    if ($iw <= 0 || $ih <= 0 || $iw > 9999 || $ih > 9999) {
+      LOG (($verbose_pbm || $verbose_load),
+           "ludicrous image dimensions: $iw x $ih (" . length($body) .
+           "): $img");
+      $body = undef;
+      return 0;
+    }
+
     open (my $out, '>', $image_tmp1) || error ("writing $image_tmp1: $!");
     (print $out $body) || error ("writing $image_tmp1: $!");
     close ($out) || error ("writing $image_tmp1: $!");
index d6505df2f5f7cda72df903a218dd618fb78d5304..0b621c8c3c5f1cd8caff3ffedfa649357f474004 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2006-2011 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2006-2014 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -80,7 +80,7 @@ input_available_p (int fd)
 
 
 static void
-display_image (state *st, const char *file)
+display_image (Display *dpy, Window window, state *st, const char *file)
 {
   NSImage *image = [[NSImage alloc] 
                      initWithContentsOfFile:
@@ -92,10 +92,14 @@ display_image (state *st, const char *file)
     return;
   }
 
-  [image drawAtPoint: NSMakePoint (0, 0)
-            fromRect: NSMakeRect (0, 0, [image size].width, [image size].height)
-           operation: NSCompositeCopy
-            fraction: 1.0];
+  CGFloat w = [image size].width;
+  CGFloat h = [image size].height;
+  if (w <= 1 || h <= 1) {
+    fprintf (stderr, "webcollage: unparsable image \"%s\"\n", file);
+    return;
+  }
+
+  jwxyz_draw_NSImage_or_CGImage (dpy, window, True, image, 0, 0);
   [image release];
 }
 
@@ -298,7 +302,7 @@ webcollage_draw (Display *dpy, Window window, void *closure)
   const char *target = "COCOA LOAD ";
   if (!strncmp (target, buf, strlen(target))) {
     const char *file = buf + strlen(target);
-    display_image (st, file);
+    display_image (dpy, window, st, file);
   }
 
   return st->delay;
index 1b5fadfb3daecddedae080d72726b2a02fc52412..0a6e9e36be27890cc044bdd5b5b856e0b2102efa 100644 (file)
@@ -1,5 +1,5 @@
 /* webcollage-helper-cocoa --- scales and pastes one image into another
- * xscreensaver, Copyright (c) 2002-2009 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 2002-2014 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -105,7 +105,7 @@ load_image (const char *file)
   NSImage *image = [[NSImage alloc] 
                      initWithContentsOfFile:
                        [NSString stringWithCString: file
-                                          encoding: kCFStringEncodingUTF8]];
+                                          encoding: NSUTF8StringEncoding]];
   if (! image)
     image = load_ppm_image (file);
 
@@ -114,6 +114,14 @@ load_image (const char *file)
     exit (1);
   }
 
+  
+  // [NSImage size] defaults to the image size in points instead of pixels,
+  // so if an image file specified "pixels per inch" we can end up with
+  // absurdly sized images.  Set it back to 1:1 pixel:point.
+  //
+  NSImageRep *rep = [image.representations firstObject];
+  image.size = NSMakeSize (rep.pixelsWide, rep.pixelsHigh);
+
   return image;
 }
 
index 843a1cfbbcf4f4e1a419183ac8cff2502a8ff16b..e643b28d1b7eab8a757fd189454c0ef27a744cb3 100644 (file)
@@ -447,7 +447,8 @@ whirlwindwarp_draw (Display *dpy, Window window, void *closure)
         struct timeval now;
         long timediff;
         gettimeofday(&now, NULL);
-        timediff = now.tv_sec*1000000 + now.tv_usec - st->lastframe.tv_sec*1000000 - st->lastframe.tv_usec;
+        /* timediff = now.tv_sec*1000000 + now.tv_usec - st->lastframe.tv_sec*1000000 - st->lastframe.tv_usec; */
+        timediff = (now.tv_sec - st->lastframe.tv_sec) * 1000000 + now.tv_usec - st->lastframe.tv_usec;
         if (timediff < utimeperframe) {
           /* fprintf(stderr,"sleeping for %i\n",utimeperframe-timediff); */
           this_delay = (utimeperframe-timediff);
index d5b71f9bb4f956b595cd1daf50b3a6d324117bd4..2716f30184d9934161e0c5105a852d3af8958ae9 100644 (file)
@@ -19,7 +19,7 @@
 #include "xlockmoreI.h"
 #include "screenhack.h"
 
-#ifndef HAVE_COCOA
+#if !defined(HAVE_COCOA) && !defined(HAVE_ANDROID)
 # include <X11/Intrinsic.h>
 #endif /* !HAVE_COCOA */
 
@@ -292,12 +292,12 @@ xlockmore_init (Display *dpy, Window window,
   mi->window = window;
   XGetWindowAttributes (dpy, window, &mi->xgwa);
   
-#ifdef HAVE_COCOA
+#if defined(HAVE_COCOA) || defined(HAVE_ANDROID)
   
 # if 0
-  /* In Cocoa-based xscreensaver, all hacks run in the same address space,
-     so each one needs to get its own screen number.  Believe what jwxyz
-     says about screen counts and numbers.
+  /* In Cocoa and Android-based xscreensaver, all hacks run in the
+     same address space, so each one needs to get its own screen
+     number.  Believe what jwxyz says about screen counts and numbers.
    */
   mi->num_screens = ScreenCount (dpy);
   mi->screen_number = XScreenNumberOfScreen (mi->xgwa.screen);
@@ -316,7 +316,7 @@ xlockmore_init (Display *dpy, Window window,
 # endif
   root_p = True;
 
-#else /* !HAVE_COCOA -- real Xlib */
+#else /* real Xlib */
   
   /* In Xlib-based xscreensaver, each hack runs in its own address space,
      so each one only needs to be aware of one screen.
index baedf6bad577e9458869f63b1bfdb44f718c9602..d477970f54f9cc2edd82e1981e7ee1ecc92750d6 100644 (file)
@@ -112,10 +112,10 @@ ERROR!  Sorry, xlockmore.h requires ANSI C (gcc, for example.)
    a struct in `MODULENAME_xscreensaver_function_table',
    and a pointer to that in `xscreensaver_function_table'.
 
-   In a Cocoa world, we only define the prefixed symbol;
+   In a Cocoa or Android world, we only define the prefixed symbol;
    the un-prefixed symbol does not exist.
  */
-#ifdef HAVE_COCOA
+#if defined(HAVE_COCOA) || defined(HAVE_ANDROID)
 # define XSCREENSAVER_LINK(NAME)
 #else
 # define XSCREENSAVER_LINK(NAME) \
@@ -123,10 +123,10 @@ ERROR!  Sorry, xlockmore.h requires ANSI C (gcc, for example.)
 #endif
 
 
-# if !defined(USE_GL) || defined(HAVE_COCOA)
+# if !defined(USE_GL) || defined(HAVE_COCOA) || defined(HAVE_ANDROID)
 #  define xlockmore_pick_gl_visual 0
 #  define xlockmore_validate_gl_visual 0
-# endif  /* !USE_GL || HAVE_COCOA */
+# endif  /* !USE_GL || HAVE_COCOA || HAVE_ANDROID */
 
 # ifdef USE_GL
 #  define XLOCKMORE_FPS xlockmore_gl_compute_fps
index 75909784974fefa3e7bdf3cebce4839f4443b651..42e553e0c1a5ce61759cbe4aa71cf3c2f58cb409 100644 (file)
@@ -1,5 +1,5 @@
 /* xlockmore.h --- xscreensaver compatibility layer for xlockmore modules.
- * xscreensaver, Copyright (c) 1997-2012 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1997-2014 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -45,6 +45,8 @@ typedef struct ModeInfo ModeInfo;
 #   include <OpenGL/gl.h>
 #   include <OpenGL/glu.h>
 #  endif
+# elif defined(HAVE_ANDROID)
+#  include <GLES/gl.h>
 # else
 #  include <GL/gl.h>
 #  include <GL/glu.h>
@@ -166,7 +168,7 @@ struct xlockmore_function_table {
   Bool (*hack_handle_events) (ModeInfo *, XEvent *);
   ModeSpecOpt *opts;
 
-  unsigned screen_count; /* Only used on the OS X and iOS ports. */
+  unsigned int screen_count; /* Only used on the OS X and iOS ports. */
 };
 
 #endif /* __XLOCKMORE_INTERNAL_H__ */
index 85ed51e72cf5f438c9e4ec24a05a3e0820cbb967..04e96fb0d90c5f8562b8da1beedf668b22b9d599 100644 (file)
@@ -342,6 +342,7 @@ fill_input (m_state *s)
       s->buf [s->buf_pos] = (char) c;
     }
 
+
   if (n > 0)
     {
         s->do_fill_buff = False;
@@ -1824,7 +1825,7 @@ static const char *xmatrix_defaults [] = {
   "*knockKnock:                   True",
   "*usePipe:              False",
   "*usePty:                False",
-  "*program:              xscreensaver-text",
+  "*program:              xscreensaver-text --latin1",
   "*geometry:             960x720",
   0
 };
index 79d52076474367d4ec64aaff3181ab2865d937f9..d7d4e32355031deedd88c1aeca5289516fc95ce2 100755 (executable)
@@ -24,7 +24,7 @@ use strict;
 use Text::Wrap;
 
 my $progname = $0; $progname =~ s@.*/@@g;
-my ($version) = ('$Revision: 1.6 $' =~ m/\s(\d[.\d]+)\s/s);
+my ($version) = ('$Revision: 1.7 $' =~ m/\s(\d[.\d]+)\s/s);
 
 my $verbose = 0;
 
@@ -182,6 +182,7 @@ sub xml2man($) {
     } elsif (m@^<_description>\s*(.*)\s*</_description>@) {
       $desc = $1;
     } elsif (m@^<xscreensaver-updater@) {
+    } elsif (m@^<video\b@) {
     } else {
       print STDERR "$progname: ERROR: UNKNOWN: $_\n";
     }
index e2c4203250c8dcbaa7807c4de8d09287ba4088c1..3c691aaff37063e0cdca44a4dac457d246e7fff6 100644 (file)
@@ -11,6 +11,7 @@
  */
 
 #include <math.h>
+#include <limits.h>
 #include "screenhack.h"
 
 #ifndef MIN
@@ -56,13 +57,15 @@ struct state {
 static long currentTimeInMs(struct state *st)
 { 
   struct timeval curTime;
+  unsigned long ret_unsigned;
 #ifdef GETTIMEOFDAY_TWO_ARGS
   struct timezone tz = {0,0};
   gettimeofday(&curTime, &tz);
 #else
   gettimeofday(&curTime);
 #endif
-  return curTime.tv_sec*1000 + curTime.tv_usec/1000.0;
+  ret_unsigned = curTime.tv_sec *1000U + curTime.tv_usec / 1000;
+  return (ret_unsigned <= LONG_MAX) ? ret_unsigned : -1 - (long)(ULONG_MAX - ret_unsigned);
 }
 
 static void *
@@ -124,7 +127,7 @@ zoom_init (Display *dpy, Window window)
   XFillRectangle(st->dpy, st->window, st->window_gc, 0, 0, st->sizex, st->sizey);
   XSetWindowBackground(st->dpy, st->window, bg);
 
-  st->start_time = time ((time_t) 0);
+  st->start_time = time ((time_t *) 0);
   st->img_loader = load_image_async_simple (0, xgwa.screen, st->window,
                                             st->pm, 0, 0);
 
@@ -153,13 +156,14 @@ zoom_draw (Display *dpy, Window window, void *closure)
   unsigned x, y, i, j;
 
   long now;
+  unsigned long now_unsigned;
 
   if (st->img_loader)   /* still loading */
     {
       st->img_loader = load_image_async_simple (st->img_loader, 0, 0, 0, 0, 0);
       if (! st->img_loader) {  /* just finished */
         XClearWindow (st->dpy, st->window);
-        st->start_time = time ((time_t) 0);
+        st->start_time = time ((time_t *) 0);
         if (!st->lenses) {
           st->orig_map = XGetImage(st->dpy, st->pm, 0, 0, st->sizex, st->sizey, ~0L, ZPixmap);
 /*          XFreePixmap(st->dpy, st->pm);
@@ -170,7 +174,7 @@ zoom_draw (Display *dpy, Window window, void *closure)
     }
 
   if (!st->img_loader &&
-      st->start_time + st->duration < time ((time_t) 0)) {
+      st->start_time + st->duration < time ((time_t *) 0)) {
     st->img_loader = load_image_async_simple (0, st->screen, st->window,
                                               st->pm, 0, 0);
     return st->delay;
@@ -179,7 +183,8 @@ zoom_draw (Display *dpy, Window window, void *closure)
 #define nrnd(x) (random() % (x))
 
   now = currentTimeInMs(st);
-  now += st->sinusoid_offset;  /* don't run multiple screens in lock-step */
+  now_unsigned = (unsigned long) now + st->sinusoid_offset;  /* don't run multiple screens in lock-step */
+  now = (now_unsigned <= LONG_MAX) ? now_unsigned : -1 - (long)(ULONG_MAX - now_unsigned);
 
   /* find new x,y */
   st->tlx = ((1. + sin(((double)now) / X_PERIOD * 2. * M_PI))/2.0)
index e2b00cc1697847717247ec9101616aa5c7180145..c6c95c1629300d80e059b5dca041e752a08b3ea2 100644 (file)
@@ -1,4 +1,4 @@
-# Auto-generated: Wed Sep 10 20:26:41 PDT 2014
+# Auto-generated: Sat Nov 15 15:33:42 PST 2014
 driver/demo-Gtk-conf.c
 driver/demo-Gtk.c
 driver/screensaver-properties.desktop.in
@@ -16,6 +16,7 @@ hacks/config/atlantis.xml
 hacks/config/attraction.xml
 hacks/config/atunnel.xml
 hacks/config/barcode.xml
+hacks/config/binaryring.xml
 hacks/config/blaster.xml
 hacks/config/blinkbox.xml
 hacks/config/blitspin.xml
@@ -35,6 +36,7 @@ hacks/config/carousel.xml
 hacks/config/ccurve.xml
 hacks/config/celtic.xml
 hacks/config/circuit.xml
+hacks/config/cityflow.xml
 hacks/config/cloudlife.xml
 hacks/config/companioncube.xml
 hacks/config/compass.xml
@@ -81,6 +83,7 @@ hacks/config/fuzzyflakes.xml
 hacks/config/galaxy.xml
 hacks/config/gears.xml
 hacks/config/geodesic.xml
+hacks/config/geodesicgears.xml
 hacks/config/gflux.xml
 hacks/config/glblur.xml
 hacks/config/glcells.xml
index 199f889ec67a68bcc6b8b4ad340766a23c57e1c1..9817517d133fc7ddba2e6a82a98d71ba85461ec4 100644 (file)
--- a/setup.com
+++ b/setup.com
@@ -10,6 +10,7 @@ $ apollonian  :== $'mydir'apollonian
 $ apple2       :== $'mydir'apple2
 $ attraction   :== $'mydir'attraction
 $ barcode      :== $'mydir'barcode
+$ binaryring   :== $'mydir'binaryring
 $ blaster      :== $'mydir'blaster
 $ blitspin     :== $'mydir'blitspin
 $ bouboule     :== $'mydir'bouboule
index 1533ca6fb350292e2e12dff02c130ddb4cc532b5..5df7f0c6adee9f037adab039c2b0ed3a2b115399 100644 (file)
@@ -106,17 +106,17 @@ SRCS              = alpha.c colors.c fade.c grabscreen.c grabclient.c hsv.c \
                  overlay.c resources.c spline.c usleep.c visual.c \
                  visual-gl.c xmu.c logo.c yarandom.c erase.c \
                  xshm.c xdbe.c colorbars.c minixpm.c textclient.c \
-                 aligned_malloc.c thread_util.c
+                 aligned_malloc.c thread_util.c async_netdb.c xft.c utf8wc.c
 OBJS           = alpha.o colors.o fade.o grabscreen.o grabclient.o hsv.o \
                  overlay.o resources.o spline.o usleep.o visual.o \
                  visual-gl.o xmu.o logo.o yarandom.o erase.o \
                  xshm.o xdbe.o colorbars.o minixpm.o textclient.o \
-                 aligned_malloc.o thread_util.o
+                 aligned_malloc.o thread_util.o async_netdb.o xft.o utf8wc.o
 HDRS           = alpha.h colors.h fade.h grabscreen.h hsv.h resources.h \
                  spline.h usleep.h utils.h version.h visual.h vroot.h xmu.h \
                  yarandom.h erase.h xshm.h xdbe.h colorbars.h minixpm.h \
                  xscreensaver-intl.h textclient.h aligned_malloc.h \
-                 thread_util.h
+                 thread_util.h async_netdb.h xft.h utf8wc.h
 STAR           = *
 LOGOS          = images/$(STAR).xpm \
                  images/$(STAR).png \
@@ -227,6 +227,10 @@ alpha.o: $(srcdir)/resources.h
 alpha.o: $(srcdir)/utils.h
 alpha.o: $(srcdir)/visual.h
 alpha.o: $(srcdir)/yarandom.h
+async_netdb.o: $(srcdir)/aligned_malloc.h
+async_netdb.o: $(srcdir)/async_netdb.h
+async_netdb.o: ../config.h
+async_netdb.o: $(srcdir)/thread_util.h
 colorbars.o: $(srcdir)/colorbars.h
 colorbars.o: ../config.h
 colorbars.o: $(srcdir)/resources.h
@@ -293,6 +297,8 @@ thread_util.o: ../config.h
 thread_util.o: $(srcdir)/resources.h
 thread_util.o: $(srcdir)/thread_util.h
 usleep.o: ../config.h
+utf8wc.o: ../config.h
+utf8wc.o: $(srcdir)/utf8wc.h
 visual-gl.o: ../config.h
 visual-gl.o: $(srcdir)/resources.h
 visual-gl.o: $(srcdir)/utils.h
@@ -305,6 +311,7 @@ xdbe.o: ../config.h
 xdbe.o: $(srcdir)/resources.h
 xdbe.o: $(srcdir)/utils.h
 xdbe.o: $(srcdir)/xdbe.h
+xft.o: ../config.h
 xmu.o: ../config.h
 xshm.o: ../config.h
 xshm.o: $(srcdir)/resources.h
diff --git a/utils/async_netdb.c b/utils/async_netdb.c
new file mode 100644 (file)
index 0000000..5c52161
--- /dev/null
@@ -0,0 +1,449 @@
+/* vi: set tw=78: */
+
+/* async_netdb.c, Copyright (c) Dave Odell <dmo2118@gmail.com>
+ *
+ * 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.
+ *
+ * Threaded versions of get(name/addr)info to replace calls to
+ * gethostby(name/addr), for Sonar.
+ */
+
+#include "async_netdb.h"
+
+#include "thread_util.h"
+
+#include <assert.h>
+#include <errno.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <string.h>
+#include <unistd.h>
+
+/* This is very much system-dependent, but hopefully 64K covers it just about
+   everywhere. The threads here shouldn't need much. */
+#define ASYNC_NETDB_STACK 65536
+
+#if ASYNC_NETDB_USE_GAI
+
+# define _get_addr_family(addr) ((addr)->ss_family)
+# define _get_addr_len(addr) ((addr)->ss_len)
+
+static int _has_threads;
+
+int _async_netdb_is_done (struct io_thread *io)
+{
+  if (_has_threads >= 0)
+    return io_thread_is_done (io);
+  return 1;
+}
+
+#else /* ASYNC_NETDB_USE_GAI */
+
+# define _get_addr_family(addr) ((addr)->sin_family)
+# define _get_addr_len(addr) ((addr)->sin_len)
+
+static const int _has_threads = -1;
+
+# if ASYNC_NETDB_FAKE_EAI
+
+const char *_async_netdb_strerror (int errcode)
+{
+  /* (h)strerror should return messages in the user's preferred language. */
+
+  /* On Solaris, gethostbyname(3) is in libnsl, but hstrerror(3) is in
+     libresolv. Not that it matters, since Solaris has real gai_strerror in
+     libsocket. */
+
+  switch (errcode)
+    {
+    case EAI_NONAME:
+      return hstrerror (HOST_NOT_FOUND);
+    case EAI_AGAIN:
+      return hstrerror (TRY_AGAIN);
+    case EAI_FAIL:
+      return hstrerror (NO_RECOVERY);
+    case EAI_MEMORY:
+      return strerror (ENOMEM);
+    }
+  /* case EAI_SYSTEM: default: */
+  return strerror (EINVAL); /* No good errno equivalent here. */
+}
+
+# endif /* ASYNC_NETDB_FAKE_EAI */
+
+#endif /* !ASYNC_NETDB_USE_GAI */
+
+static int _translate_h_errno (int error)
+{
+  switch (error)
+    {
+    case HOST_NOT_FOUND:
+    case NO_DATA:
+      return EAI_NONAME;
+    case TRY_AGAIN:
+      return EAI_AGAIN;
+    }
+
+  /* case NO_RECOVERY: default: */
+  return EAI_FAIL;
+}
+
+/* async_name_from_addr - */
+
+#if ASYNC_NETDB_USE_GAI
+
+static void *
+_async_name_from_addr_thread (void *self_raw)
+{
+  /* The stack is unusually small here. If this crashes, you may need to bump
+     the value of ASYNC_NETDB_STACK. */
+
+  async_name_from_addr_t self = (async_name_from_addr_t)self_raw;
+
+  /* getnameinfo() is thread-safe, gethostbyaddr() is not. */
+  self->gai_error = getnameinfo ((void *)&self->param.addr,
+                                 self->param.addrlen,
+                                 self->host, sizeof(self->host), NULL, 0,
+                                 NI_NAMEREQD);
+  /* Removing NI_MAKEREQD would require a call to inet_ntoa in
+     async_name_from_addr_finish. */
+
+  self->errno_error = errno;
+
+  if (io_thread_return (&self->io))
+    thread_free(self);
+
+  return NULL;
+}
+
+#endif /* ASYNC_NETDB_USE_GAI */
+
+static void
+_async_name_from_addr_set_param (struct _async_name_from_addr_param *self,
+                                 const struct sockaddr *addr,
+                                 socklen_t addrlen)
+{
+  self->addrlen = addrlen;
+  memcpy (&self->addr, addr, addrlen);
+
+#if HAVE_STRUCT_SOCKADDR_SA_LEN
+  _get_addr_len (&self->addr) = addrlen; /* The BSDs need this. */
+#endif
+}
+
+async_name_from_addr_t
+async_name_from_addr_start (Display *dpy, const struct sockaddr *addr,
+                            socklen_t addrlen)
+{
+  assert (addrlen);
+  assert (addrlen <= sizeof (async_netdb_sockaddr_storage_t));
+
+#if ASYNC_NETDB_USE_GAI
+  _has_threads = threads_available (dpy);
+  if (_has_threads >= 0)
+    {
+      async_name_from_addr_t self, result;
+
+      if (thread_malloc ((void **)&self, dpy,
+                         sizeof (struct async_name_from_addr)))
+        return NULL;
+
+      _async_name_from_addr_set_param (&self->param, addr, addrlen);
+
+      result = io_thread_create (&self->io, self,
+                                 _async_name_from_addr_thread, dpy,
+                                 ASYNC_NETDB_STACK);
+      if (!result)
+        thread_free (self);
+      return result;
+    }
+#endif /* ASYNC_NETDB_USE_GAI */
+
+  {
+    struct _async_name_from_addr_param *result =
+      (struct _async_name_from_addr_param *)
+      malloc (sizeof (struct _async_name_from_addr_param));
+
+    if (result)
+      _async_name_from_addr_set_param (result, addr, addrlen);
+
+    return (async_name_from_addr_t)result;
+  }
+}
+
+#if ASYNC_NETDB_USE_GAI
+void
+async_name_from_addr_cancel (async_name_from_addr_t self)
+{
+  if (_has_threads >= 0)
+    {
+      if(io_thread_cancel (&self->io))
+        thread_free (self);
+    }
+  else
+    {
+      free (self);
+    }
+}
+#endif /* ASYNC_NETDB_USE_GAI */
+
+int
+async_name_from_addr_finish (async_name_from_addr_t self_raw,
+                             char **host, int *errno_error)
+{
+#if ASYNC_NETDB_USE_GAI
+  if (_has_threads >= 0)
+    {
+      async_name_from_addr_t self = self_raw;
+      int gai_error;
+
+      io_thread_finish (&self->io);
+
+      gai_error = self->gai_error;
+      if (gai_error)
+        {
+          if (errno_error)
+            *errno_error = self->errno_error;
+          *host = NULL; /* For safety's sake. */
+        }
+      else
+        {
+          *host = strdup(self->host);
+          if (!*host)
+            gai_error = EAI_MEMORY;
+        }
+
+      thread_free (self);
+      return gai_error;
+    }
+#endif /* ASYNC_NETDB_USE_GAI */
+
+  {
+    struct _async_name_from_addr_param *self =
+      (struct _async_name_from_addr_param *)self_raw;
+
+    const struct hostent *he;
+    int error;
+    const void *raw_addr;
+    socklen_t addrlen;
+
+    switch (_get_addr_family (&self->addr))
+      {
+      case AF_INET:
+        raw_addr = &((const struct sockaddr_in *)&self->addr)->sin_addr;
+        addrlen = 4;
+        break;
+#if ASYNC_NETDB_USE_GAI
+      case AF_INET6:
+        raw_addr = &((const struct sockaddr_in6 *)&self->addr)->sin6_addr;
+        addrlen = 16;
+        break;
+#endif /* ASYNC_NETDB_USE_GAI */
+      default:
+        return EAI_NONAME;
+      }
+
+    he = gethostbyaddr(raw_addr, addrlen, _get_addr_family (&self->addr));
+    error = h_errno;
+
+    free (self);
+
+    if (!he)
+    {
+      *host = NULL; /* For safety's sake. */
+      return _translate_h_errno(error);
+    }
+
+    if (!he->h_name)
+      return EAI_NONAME;
+
+    *host = strdup (he->h_name);
+    if (!*host)
+      return EAI_MEMORY;
+
+    return 0;
+  }
+}
+
+/* async_addr_from_name - */
+
+static char *
+_async_addr_from_name_hostname (async_addr_from_name_t self)
+{
+  return (char *)(self + 1);
+}
+
+static void
+_async_addr_from_name_free (async_addr_from_name_t self)
+{
+#if ASYNC_NETDB_USE_GAI
+  if (self->res) /* FreeBSD won't do freeaddrinfo (NULL). */
+    freeaddrinfo (self->res);
+#endif
+  thread_free (self);
+}
+
+#if ASYNC_NETDB_USE_GAI
+
+static void *
+_async_addr_from_name_thread (void *self_raw)
+{
+  /* The stack is unusually small here. If this crashes, you may need to bump
+     the value of ASYNC_NETDB_STACK. */
+
+  async_addr_from_name_t self = (async_addr_from_name_t)self_raw;
+  self->gai_error = getaddrinfo (_async_addr_from_name_hostname (self), NULL,
+                                 NULL, &self->res);
+  self->errno_error = errno;
+
+  if (io_thread_return (&self->io))
+    _async_addr_from_name_free (self);
+
+  return NULL;
+}
+
+#endif /* ASYNC_NETDB_USE_GAI */
+
+/* getaddrinfo supports more than a hostname, but gethostbyname does not. */
+async_addr_from_name_t
+async_addr_from_name_start (Display *dpy, const char *hostname)
+{
+  async_addr_from_name_t self;
+  if (thread_malloc ((void **)&self, dpy,
+                     sizeof(struct async_addr_from_name) + strlen(hostname) + 1))
+    return NULL;
+
+  strcpy (_async_addr_from_name_hostname (self), hostname);
+
+#if ASYNC_NETDB_USE_GAI
+  _has_threads = threads_available (dpy);
+  self->res = NULL;
+  if (_has_threads >= 0)
+    {
+      async_addr_from_name_t result =
+        io_thread_create (&self->io, self, _async_addr_from_name_thread, dpy,
+                          ASYNC_NETDB_STACK);
+
+      if (!result)
+        thread_free(result);
+      self = result;
+    }
+#endif /* ASYNC_NETDB_USE_GAI */
+
+  return self;
+}
+
+#if ASYNC_NETDB_USE_GAI
+void
+async_addr_from_name_cancel (async_addr_from_name_t self)
+{
+  if (_has_threads >= 0)
+    {
+      if (io_thread_cancel (&self->io))
+        _async_addr_from_name_free (self);
+    }
+  else
+    {
+      thread_free (self);
+    }
+}
+#endif /* ASYNC_NETDB_USE_GAI */
+
+/* async_name_from_addr_finish does sockaddr_in or sockaddr_in6. */
+
+int
+async_addr_from_name_finish (async_addr_from_name_t self, void *addr,
+                             socklen_t *addrlen, int *errno_error)
+{
+#if ASYNC_NETDB_USE_GAI
+  if (_has_threads >= 0)
+    {
+      int gai_error;
+      io_thread_finish (&self->io);
+
+      gai_error = self->gai_error;
+      if (errno_error)
+        *errno_error = self->errno_error;
+
+      if (!gai_error)
+        {
+          struct addrinfo *ai = self->res;
+          if (!ai)
+            gai_error = EAI_NONAME;
+          else
+            {
+              assert (ai->ai_addrlen <=
+                      sizeof (async_netdb_sockaddr_storage_t));
+              memcpy (addr, ai->ai_addr, ai->ai_addrlen);
+              *addrlen = ai->ai_addrlen;
+            }
+        }
+
+      _async_addr_from_name_free (self);
+      return gai_error;
+    }
+#endif /* ASYNC_NETDB_USE_GAI */
+
+  {
+    struct hostent *he =
+      gethostbyname (_async_addr_from_name_hostname (self));
+    int error = h_errno;
+    void *raw_addr;
+    async_netdb_sockaddr_storage_t *addr_storage =
+      (async_netdb_sockaddr_storage_t *)addr;
+
+    _async_addr_from_name_free (self);
+
+    if (!he)
+      return _translate_h_errno (error);
+
+    switch (he->h_addrtype)
+      {
+      case AF_INET:
+        {
+          struct sockaddr_in *addr_in = (struct sockaddr_in *)addr;
+          addr_in->sin_port = 0;
+          raw_addr = &addr_in->sin_addr;
+          *addrlen = sizeof(*addr_in);
+          assert (he->h_length == 4);
+        }
+        break;
+#if ASYNC_NETDB_USE_GAI
+      case AF_INET6:
+        {
+          struct sockaddr_in6 *addr_in6 = (struct sockaddr_in6 *)addr;
+          addr_in6->sin6_port = 0;
+          addr_in6->sin6_flowinfo = 0;
+          raw_addr = &addr_in6->sin6_addr;
+          *addrlen = sizeof(*addr_in6);
+          assert (he->h_length == 16);
+        }
+        break;
+#endif /* ASYNC_NETDB_USE_GAI */
+      default:
+        return EAI_NONAME;
+      }
+
+#if HAVE_STRUCT_SOCKADDR_SA_LEN
+    _get_addr_len (addr_storage) = *addrlen;
+#endif
+    _get_addr_family (addr_storage) = he->h_addrtype;
+
+    memcpy (raw_addr, he->h_addr_list[0], he->h_length);
+    return 0;
+  }
+}
+
+/* Local Variables:      */
+/* mode: c               */
+/* fill-column: 78       */
+/* c-file-style: "gnu"   */
+/* c-basic-offset: 2     */
+/* indent-tabs-mode: nil */
+/* End:                  */
diff --git a/utils/async_netdb.h b/utils/async_netdb.h
new file mode 100644 (file)
index 0000000..df6c59c
--- /dev/null
@@ -0,0 +1,211 @@
+/* vi: set tw=78: */
+
+/* async_netdb.h, Copyright (c) Dave Odell <dmo2118@gmail.com>
+ *
+ * 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 ASYNC_NETDB_H
+#define ASYNC_NETDB_H
+
+#include "thread_util.h"
+
+#include <netdb.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <unistd.h>
+
+/*
+   Both async_name_from_addr_* and async_addr_from_name_* follow basic pattern
+   for io_thread clients as described in thread_util.h:
+   1. async_*_from_*_start
+   2. async_*_from_*_is_done (repeat as necessary)
+   3a. async_*_from_*_finish to retrieve the results, or:
+   3b. async_*_from_*_cancel to abort the lookup.
+
+   On systems that can't do asynchronous host lookups, the *_finish functions
+   do the actual lookup.
+ */
+
+#ifndef NI_MAXHOST
+/*
+   From the glibc man page for getnameinfo(3):
+      Since glibc 2.8, these definitions are exposed only if one of the
+      feature test macros _BSD_SOURCE, _SVID_SOURCE, or _GNU_SOURCE is
+      defined.
+ */
+# define NI_MAXHOST 1025
+#endif
+
+#if HAVE_PTHREAD && HAVE_GETADDRINFO
+/*
+   If threads or getaddrinfo() are unavailable, then the older gethostbyname()
+   and gethostbyaddr() functions are used, and IPv6 is disabled.
+ */
+# define ASYNC_NETDB_USE_GAI 1
+#endif
+
+#if ASYNC_NETDB_USE_GAI
+
+typedef struct sockaddr_storage async_netdb_sockaddr_storage_t;
+
+int _async_netdb_is_done (struct io_thread *io);
+
+#else
+
+typedef struct sockaddr_in async_netdb_sockaddr_storage_t;
+
+# ifndef EAI_SYSTEM
+/* The EAI_* codes are specified specifically as preprocessor macros, so
+   the #ifdef here should always work...
+   http://pubs.opengroup.org/onlinepubs/009604499/basedefs/netdb.h.html */
+
+#   define ASYNC_NETDB_FAKE_EAI 1
+
+/* Even without addrinfo, the EAI_* error codes are used. The numbers are from
+   Linux's netdb.h. */
+#   define EAI_NONAME -2
+#   define EAI_AGAIN  -3
+#   define EAI_FAIL   -4
+#   define EAI_MEMORY -10
+#   define EAI_SYSTEM -11
+
+const char *_async_netdb_strerror (int errcode);
+
+#   define gai_strerror(errcode) _async_netdb_strerror (errcode)
+# endif
+
+# define _async_netdb_is_done(io) 1
+
+#endif
+
+/* In non-threaded mode, _async_name_from_addr_param is used in place of
+   async_name_from_addr. */
+struct _async_name_from_addr_param
+{
+  socklen_t addrlen;
+  async_netdb_sockaddr_storage_t addr;
+};
+
+typedef struct async_name_from_addr
+{
+  /*
+     Stupid memory trick, thwarted: The host string could be at the beginning
+     of this structure, and the memory block that contains this struct could
+     be resized and returned directly in async_name_from_addr_finish. But...
+
+     There is no aligned_realloc. In fact, aligned_realloc is a bit of a
+     problem, mostly because:
+     1. realloc() is the only way to resize a heap-allocated memory block.
+     2. realloc() moves memory.
+     3. The location that realloc() moves memory to won't be aligned.
+   */
+
+  struct _async_name_from_addr_param param;
+  struct io_thread io;
+
+  char host[NI_MAXHOST];
+  int gai_error;
+  int errno_error;
+
+} *async_name_from_addr_t;
+
+async_name_from_addr_t async_name_from_addr_start (Display *dpy,
+                                                   const struct sockaddr *addr,
+                                                   socklen_t addrlen);
+/*
+   Starts an asynchronous name-from-address lookup.
+   dpy:     An X11 Display with a .useThreads resource.
+   addr:    An address. Like various socket functions (e.g. bind(2),
+            connect(2), sendto(2)), this isn't really a struct sockaddr so
+            much as a "subtype" of sockaddr, like sockaddr_in, or
+            sockaddr_in6, or whatever.
+   addrlen: The (actual) length of *addr.
+   Returns NULL if the request couldn't be created (due to low memory).
+ */
+
+#define async_name_from_addr_is_done(self) _async_netdb_is_done (&(self)->io)
+
+#if ASYNC_NETDB_USE_GAI
+void async_name_from_addr_cancel (async_name_from_addr_t self);
+#else
+# define async_name_from_addr_cancel(self) (free (self))
+#endif
+
+int async_name_from_addr_finish (async_name_from_addr_t self,
+                                 char **host, int *errno_error);
+/*
+   Gets the result of an asynchronous name-from-address lookup. If the lookup
+   operation is still in progress, or if the system can't do async lookups,
+   this will block. This cleans up the lookup operation; do not use 'self'
+   after calling this function.
+   self:        The lookup operation.
+   host:        If no error, the name of the host. Free this with free(3).
+   errno_error: The value of errno if EAI_SYSTEM is returned. Can be NULL.
+   Returns 0 on success, otherwise an error from getnameinfo(3).
+ */
+
+/* In non-threaded mode, async_addr_from_name contains different stuff. */
+typedef struct async_addr_from_name
+{
+#if ASYNC_NETDB_USE_GAI
+  struct io_thread io;
+
+  int gai_error;
+  int errno_error;
+
+  struct addrinfo *res;
+#else
+  char dont_complain_about_empty_structs;
+#endif
+} *async_addr_from_name_t;
+
+async_addr_from_name_t async_addr_from_name_start (Display *dpy,
+                                                   const char *host);
+/*
+   Starts an asynchronous address-from-name lookup.
+   dpy:  An X11 display.
+   host: The hostname to look up.
+   Returns NULL if the request couldn't be created (due to low memory).
+ */
+
+#define async_addr_from_name_is_done(self) _async_netdb_is_done (&(self)->io)
+
+#if ASYNC_NETDB_USE_GAI
+void async_addr_from_name_cancel (async_addr_from_name_t self);
+#else
+# define async_addr_from_name_cancel(self) (thread_free (self));
+#endif
+
+/* sockaddr must be sizeof(async_netdb_sockaddr_storage_t) in size. */
+int async_addr_from_name_finish (async_addr_from_name_t self, void *addr,
+                                 socklen_t *addrlen, int *errno_error);
+/*
+   Returns the address from an asynchronous address-from-name operation. If
+   the lookup is still in progress, or the system can't do an asynchronous
+   lookup, this blocks. This cleans up the lookup operation; do not use 'self'
+   after calling this function.
+   self:        The lookup operation.
+   addr:        A sockaddr. This must be as large as or larger than
+                sizeof(async_netdb_sockaddr_storage_t). (Hint: just use an
+                instance of async_netdb_sockaddr_storage_t itself here.)
+   addrlen:     The length of the obtained sockaddr.
+   errno_error: The value of errno if EAI_SYSTEM is returned. Can be NULL.
+   Returns 0 on success, or an error from getaddrinfo(3).
+ */
+
+#endif
+
+/* Local Variables:      */
+/* mode: c               */
+/* fill-column: 78       */
+/* c-file-style: "gnu"   */
+/* c-basic-offset: 2     */
+/* indent-tabs-mode: nil */
+/* End:                  */
index c8534970a9ed13ce0c20986cc58e02f36e95cfd6..36e2a95c3facb601746c158d3e29c2eb91391c0a 100644 (file)
@@ -1,5 +1,6 @@
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) ALIGNED_MALLOC.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) ALPHA.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) ASYNC_NETDB.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) COLORBARS.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) COLORS.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) ERASE.C
@@ -15,11 +16,13 @@ $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) SPLINE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) TEXTCLIENT.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) THREAD_UTIL.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) USLEEP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) UTF8WC.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VISUAL.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VISUAL-GL.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VMS-GTOD.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VMS-STRDUP.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) XDBE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) XFT.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) XMU.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) XSHM.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) YARANDOM.C
index df494849695c8ab3adb044c953d5b102ca26f25b..c7468629256043f938bed3dbd23752ebf134d50f 100644 (file)
@@ -1,5 +1,6 @@
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) ALIGNED_MALLOC.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) ALPHA.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) ASYNC_NETDB.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) COLORBARS.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) COLORS.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) ERASE.C
@@ -15,11 +16,13 @@ $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) SPLINE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) TEXTCLIENT.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) THREAD_UTIL.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) USLEEP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) UTF8WC.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VISUAL.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VISUAL-GL.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VMS-GTOD.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VMS-STRDUP.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) XDBE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) XFT.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) XMU.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) XSHM.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) YARANDOM.C
index dd8b225807843f995af36529161df20aaecc3e66..ff90820fb4ff0b72bfe9a0e9dfef76711bccde86 100644 (file)
@@ -527,26 +527,48 @@ struct pipe_closure {
 
 # ifndef USE_IPHONE
 
+# define BACKSLASH(c) \
+  (! ((c >= 'a' && c <= 'z') || \
+      (c >= 'A' && c <= 'Z') || \
+      (c >= '0' && c <= '9') || \
+      c == '.' || c == '_' || c == '-' || c == '+' || c == '/'))
+
 /* Gets the name of an image file to load by running xscreensaver-getimage-file
    at the end of a pipe.  This can be very slow!
  */
 static FILE *
 open_image_name_pipe (const char *dir)
 {
-  char *cmd = malloc (strlen(dir) * 2 + 100);
   char *s;
-  strcpy (cmd, "xscreensaver-getimage-file --name ");
-  s = cmd + strlen (cmd);
+
+# ifdef HAVE_COCOA
+  /* /bin/sh on OS X 10.10 wipes out the PATH. */
+  const char *path = getenv("PATH");
+  char *cmd = s = malloc ((strlen(dir) + strlen(path)) * 2 + 100);
+  strcpy (s, "/bin/sh -c 'export PATH=");
+  s += strlen (s);
+  while (*path) {
+    char c = *path++;
+    if (BACKSLASH(c)) *s++ = '\\';
+    *s++ = c;
+  }
+  strcpy (s, "; ");
+  s += strlen (s);
+# else
+  char *cmd = s = malloc (strlen(dir) * 2 + 100);
+# endif
+
+  strcpy (s, "xscreensaver-getimage-file --name ");
+  s += strlen (s);
   while (*dir) {
     char c = *dir++;
-    /* put a backslash in front of any character that might confuse sh. */
-    if (! ((c >= 'a' && c <= 'z') ||
-           (c >= 'A' && c <= 'Z') ||
-           (c >= '0' && c <= '9') ||
-           c == '.' || c == '_' || c == '-' || c == '+' || c == '/'))
-      *s++ = '\\';
+    if (BACKSLASH(c)) *s++ = '\\';
     *s++ = c;
   }
+# ifdef HAVE_COCOA
+  strcpy (s, "'");
+  s += strlen (s);
+# endif
   *s = 0;
 
   FILE *pipe = popen (cmd, "r");
index d95a103cd52e04fb6b6c5ba33e1d261741c5dd80..7b54adc635dadcd8b4274318c33ef9383354a3e3 100644 (file)
@@ -15,7 +15,7 @@
 extern char *progname;
 
 
-#ifndef HAVE_COCOA
+#if !defined(HAVE_COCOA) && !defined(HAVE_ANDROID)
 
 #include <X11/Xresource.h>
 
@@ -135,10 +135,10 @@ get_float_resource (Display *dpy, char *res_name, char *res_class)
   return 0.0;
 }
 
-#endif /* !HAVE_COCOA */
+#endif /* !HAVE_COCOA && !HAVE_ANDROID */
 
 
-/* These functions are the same with Xlib and Cocoa:
+/* These functions are the same with Xlib, Cocoa and Android:
  */
 
 
index 794441f9c71d33913320d4566876b300cfe691b5..abb6f1191267a51089d857ea58e93af73752a2a3 100644 (file)
@@ -93,16 +93,40 @@ subproc_cb (XtPointer closure, int *source, XtInputId *id)
 }
 
 
+# define BACKSLASH(c) \
+  (! ((c >= 'a' && c <= 'z') || \
+      (c >= 'A' && c <= 'Z') || \
+      (c >= '0' && c <= '9') || \
+      c == '.' || c == '_' || c == '-' || c == '+' || c == '/'))
+
 static void
 launch_text_generator (text_data *d)
 {
   XtAppContext app = XtDisplayToApplicationContext (d->dpy);
   char buf[255];
   const char *oprogram = d->program;
-  char *program = (char *) malloc (strlen (oprogram) + 50);
+  char *s;
+
+# ifdef HAVE_COCOA
+  /* /bin/sh on OS X 10.10 wipes out the PATH. */
+  const char *path = getenv("PATH");
+  char *cmd = s = malloc ((strlen(oprogram) + strlen(path)) * 2 + 100);
+  strcpy (s, "export PATH=");
+  s += strlen (s);
+  while (*path) {
+    char c = *path++;
+    if (BACKSLASH(c)) *s++ = '\\';
+    *s++ = c;
+  }
+  strcpy (s, "; ");
+  s += strlen (s);
+# else
+  char *cmd = s = malloc ((strlen(oprogram)) * 2 + 100);
+# endif
 
-  strcpy (program, "( ");
-  strcat (program, oprogram);
+  strcpy (s, "( ");
+  strcat (s, oprogram);
+  s += strlen (s);
 
   /* Kludge!  Special-case "xscreensaver-text" to tell it how wide
      the screen is.  We used to do this by just always feeding
@@ -113,15 +137,16 @@ launch_text_generator (text_data *d)
   if (!strcmp (oprogram, "xscreensaver-text"))
     {
       if (d->char_w)
-        sprintf (program + strlen(program), " --cols %d", d->char_w);
+        sprintf (s, " --cols %d", d->char_w);
       if (d->max_lines)
-        sprintf (program + strlen(program), " --lines %d", d->max_lines);
+        sprintf (s, " --lines %d", d->max_lines);
+      s += strlen(s);
     }
 
-  strcat (program, " ) 2>&1");
+  strcpy (s, " ) 2>&1");
 
 # ifdef DEBUG
-  fprintf (stderr, "%s: textclient: launch %s: %s\n", progname
+  fprintf (stderr, "%s: textclient: launch %s: %s\n", cmd
            (d->pty_p ? "pty" : "pipe"), program);
 # endif
 
@@ -152,7 +177,7 @@ launch_text_generator (text_data *d)
             abort();
           av[i++] = "/bin/sh";
           av[i++] = "-c";
-          av[i++] = program;
+          av[i++] = cmd;
           av[i] = 0;
           execvp (av[0], av);
           sprintf (buf, "%.100s: %.100s", progname, oprogram);
@@ -186,7 +211,7 @@ launch_text_generator (text_data *d)
       }
 
       if (d->pipe) abort();
-      if ((d->pipe = popen (program, "r")))
+      if ((d->pipe = popen (cmd, "r")))
        {
           if (d->pipe_id) abort();
          d->pipe_id =
@@ -199,12 +224,12 @@ launch_text_generator (text_data *d)
        }
       else
        {
-          sprintf (buf, "%.100s: %.100s", progname, program);
+          sprintf (buf, "%.100s: %.100s", progname, cmd);
          perror (buf);
        }
     }
 
-  free (program);
+  free (cmd);
 }
 
 
index ad02b13140c71d0a434856002a45372120e846f4..76032c48f14585092e7d523d9d74c078f618e14c 100644 (file)
@@ -1,5 +1,5 @@
 /* -*- mode: c; tab-width: 4; fill-column: 78 -*- */
-/* vi: set ts=4 tw=128: */
+/* vi: set ts=4 tw=78: */
 
 /*
 thread_util.c, Copyright (c) 2014 Dave Odell <dmo2118@gmail.com>
@@ -284,14 +284,12 @@ const pthread_mutex_t mutex_initializer =
 
 const pthread_cond_t cond_initializer = PTHREAD_COND_INITIALIZER;
 
-static long _has_pthread = 0; /* Initialize on first threadpool/barrier_create. */
+static int _has_pthread = 0; /* Initialize when needed. */
 static int _cache_line_size = sizeof(void *);
 
-#endif /* HAVE_PTHREAD */
-
-static void _thread_util_init(Display *dpy)
+/* This is actually the init function for various things in here. */
+int threads_available(Display *dpy)
 {
-#if HAVE_PTHREAD
 /*     This is maybe not thread-safe, but: this should -- and generally will --
        be called before the program launches its second thread. */
 
@@ -317,9 +315,12 @@ static void _thread_util_init(Display *dpy)
                        }
                }
        }
-#endif
+
+       return _has_pthread;
 }
 
+#endif /* HAVE_PTHREAD */
+
 /*
    hardware_concurrency() -
 
@@ -476,19 +477,18 @@ static unsigned _hardware_concurrency(void)
 
 unsigned hardware_concurrency(Display *dpy)
 {
-       _thread_util_init(dpy);
 #if HAVE_PTHREAD
-       if(_has_pthread >= 0)
+       if(threads_available(dpy) >= 0)
                return _hardware_concurrency();
 #endif
        return 1;
 }
 
-/* thread_memory_alignment() */
+/* thread_memory_alignment() */
 
 unsigned thread_memory_alignment(Display *dpy)
 {
-       _thread_util_init(dpy);
+       (void)threads_available(dpy);
 #if HAVE_PTHREAD
        return _cache_line_size;
 #else
@@ -714,7 +714,7 @@ static void _unlock_and_destroy(struct threadpool *self)
 
 int threadpool_create(struct threadpool *self, const struct threadpool_class *cls, Display *dpy, unsigned count)
 {
-       _thread_util_init(dpy);
+       (void)threads_available(dpy);
 
        self->count = count;
 
@@ -869,3 +869,177 @@ void threadpool_wait(struct threadpool *self)
        }
 #endif
 }
+
+/* io_thread - */
+
+#if HAVE_PTHREAD
+/* Without threads at compile time, there's only stubs in thread_util.h. */
+
+#      define VERSION_CHECK(cc_major, cc_minor, req_major, req_minor) \
+       ((cc_major) > (req_major) || \
+       (cc_major) == (req_major) && (cc_minor) >= (req_minor))
+
+#      if defined(__GNUC__) && (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ >= 7) || \
+       defined(__clang__) && \
+               (!defined(__apple_build_version__) && VERSION_CHECK(__clang_major__, __clang_minor__, 3, 1) || \
+                 defined(__apple_build_version__) && VERSION_CHECK(__clang_major__, __clang_minor__, 3, 1)) || \
+       defined(__ICC) && __ICC >= 1400
+
+/*
+   Clang 3.0 has a partial implementation of GNU atomics; 3.1 rounds it out.
+   http://llvm.org/viewvc/llvm-project/cfe/tags/RELEASE_30/final/include/clang/Basic/Builtins.def?view=markup
+   http://llvm.org/viewvc/llvm-project/cfe/tags/RELEASE_31/final/include/clang/Basic/Builtins.def?view=markup
+
+   Apple changes the Clang version to track Xcode versions; use
+   __apple_build_version__ to distinguish between the two.
+
+   Xcode 4.3 uses Apple LLVM 3.1, which corresponds to Clang 3.1.
+   https://en.wikipedia.org/wiki/Xcode
+
+   Earlier versions of Intel C++ may also support these intrinsics.
+ */
+
+#define _status_load(status) (__atomic_load_n((status), __ATOMIC_SEQ_CST))
+#define _status_exchange(obj, desired) (__atomic_exchange_n((obj), (desired), __ATOMIC_SEQ_CST))
+
+/* C11 atomics are around the corner, but they're not here yet for many
+   systems. (Including mine.) */
+/*
+#elif __STDC_VERSION__ >= 201112l && !defined __STDC_NO_ATOMICS__
+
+#include <stdatomic.h>
+
+#define _status_load(status) (atomic_load((status)))
+#define _status_exchange(obj, desired) (atomic_exchange((obj), (desired)))
+*/
+
+/* Solaris profiles atomic ops on at least Solaris 10. See atomic_swap(3C) and
+   membar_ops(3C). This would probably also need a snippet in configure.in.
+   http://graegert.com/programming/using-atomic-operations-in-c-on-solaris-10
+*/
+
+#      else
+
+/* No atomic variables, so here's some ugly mutex-based code instead. */
+
+/* Nothing ever destroys this mutex. */
+pthread_mutex_t _global_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+#define _lock()        PTHREAD_VERIFY(pthread_mutex_lock(&_global_mutex))
+#define _unlock() PTHREAD_VERIFY(pthread_mutex_unlock(&_global_mutex))
+
+static enum _io_thread_status _status_load(enum _io_thread_status *status)
+{
+       enum _io_thread_status result;
+       _lock();
+       result = *status;
+       _unlock();
+       return result;
+}
+
+static enum _io_thread_status _status_exchange(enum _io_thread_status *obj, enum _io_thread_status desired)
+{
+       enum _io_thread_status result;
+       _lock();
+       result = *obj;
+       *obj = desired;
+       _unlock();
+       return result;
+}
+
+#      endif
+
+void *io_thread_create(struct io_thread *self, void *parent, void *(*start_routine)(void *), Display *dpy, unsigned stacksize)
+{
+       if(threads_available(dpy) >= 0)
+       {
+               int error;
+               pthread_attr_t attr;
+               pthread_attr_t *attr_ptr = NULL;
+
+               if(stacksize)
+               {
+                       attr_ptr = &attr;
+                       if(pthread_attr_init(&attr))
+                               return NULL;
+#   if defined _POSIX_SOURCE || defined _POSIX_C_SOURCE || defined _XOPEN_SOURCE
+                       /* PTHREAD_STACK_MIN needs the above test. */
+                       assert(stacksize >= PTHREAD_STACK_MIN);
+#   endif
+                       PTHREAD_VERIFY(pthread_attr_setstacksize(&attr, stacksize));
+               }
+
+               /* This doesn't need to be an atomic store, since pthread_create(3)
+                  "synchronizes memory with respect to other threads".
+                  http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_11 */
+               self->status = _io_thread_working;
+
+               error = pthread_create(&self->thread, attr_ptr, start_routine, parent);
+               assert(!error || error == EAGAIN);
+               if(error)
+                       parent = NULL;
+
+               if(attr_ptr)
+                       PTHREAD_VERIFY(pthread_attr_destroy(attr_ptr));
+
+               return parent;
+       }
+
+       return NULL;
+}
+
+int io_thread_return(struct io_thread *self)
+{
+       if(_has_pthread >= 0)
+       {
+               enum _io_thread_status old_status = _status_exchange(&self->status, _io_thread_done);
+               assert(old_status == _io_thread_working ||
+                      old_status == _io_thread_cancelled);
+               return old_status != _io_thread_working;
+       }
+
+       return 0;
+}
+
+int io_thread_is_done(struct io_thread *self)
+{
+       if(_has_pthread >= 0)
+       {
+               int result = _status_load(&self->status);
+               assert(result != _io_thread_cancelled);
+               return result;
+       }
+       return 1;
+}
+
+int io_thread_cancel(struct io_thread *self)
+{
+       if(_has_pthread >= 0)
+       {
+               enum _io_thread_status old_status =
+                       _status_exchange(&self->status, _io_thread_cancelled);
+               assert(old_status == _io_thread_working ||
+                      old_status == _io_thread_done);
+
+               PTHREAD_VERIFY(pthread_detach(self->thread));
+               return old_status != _io_thread_working;
+       }
+
+       return 0;
+}
+
+void io_thread_finish(struct io_thread *self)
+{
+       if(_has_pthread >= 0)
+       {
+#      ifndef NDEBUG
+               enum _io_thread_status status = _status_load(&self->status);
+               assert(status == _io_thread_working ||
+                      status == _io_thread_done);
+#      endif
+               PTHREAD_VERIFY(pthread_join(self->thread, NULL));
+               assert(_status_load(&self->status) == _io_thread_done);
+       }
+}
+
+#endif /* HAVE_PTHREAD */
index 33dac8f1f2101ede5086ecf41d7d4b71f94ec2aa..b8c88031dce6af0d78b28f8d35b10f7fad233824 100644 (file)
@@ -1,5 +1,5 @@
 /* -*- mode: c; tab-width: 4; fill-column: 78 -*- */
-/* vi: set ts=4 tw=128: */
+/* vi: set ts=4 tw=78: */
 
 /*
 thread_util.h, Copyright (c) 2014 Dave Odell <dmo2118@gmail.com>
@@ -89,6 +89,15 @@ implied warranty.
 #      include <X11/Xlib.h>
 #endif
 
+#if HAVE_PTHREAD
+int threads_available(Display *dpy);
+#else
+#      define threads_available(dpy) (-1)
+#endif
+/* > 0: Threads are available. This is normally _POSIX_VERSION.
+    -1: Threads are not available.
+*/
+
 unsigned hardware_concurrency(Display *dpy);
 /* This is supposed to return the number of available CPU cores. This number
    isn't necessarily constant: a system administrator can hotplug or
@@ -271,13 +280,15 @@ struct threadpool_class
        size_t size;
 
 /*     Create the thread private object. Called in sequence for each thread
-       (effectively) from threadpool_create.  self: A pointer to size bytes of
-       memory, allocated to hold the thread object.  pool: The threadpool object
-       that owns all the threads. If the threadpool is nested in another struct,
-       try GET_PARENT_OBJ.  id: The ID for the thread; numbering starts at zero
-       and goes up by one for each thread.  Return 0 on success. On failure,
-       return a value from errno.h; this will be returned from
-       threadpool_create. */
+       (effectively) from threadpool_create.
+    self: A pointer to size bytes of memory, allocated to hold the thread
+          object.
+    pool: The threadpool object that owns all the threads. If the threadpool
+          is nested in another struct, try GET_PARENT_OBJ.
+    id:   The ID for the thread; numbering starts at zero and goes up by one
+          for each thread.
+    Return 0 on success. On failure, return a value from errno.h; this will
+    be returned from threadpool_create. */
        int (*create)(void *self, struct threadpool *pool, unsigned id);
 
 /*     Destroys the thread private object. Called in sequence (though not always
@@ -295,14 +306,133 @@ void threadpool_destroy(struct threadpool *self);
 void threadpool_run(struct threadpool *self, void (*func)(void *));
 void threadpool_wait(struct threadpool *self);
 
+/*
+   io_thread is meant to wrap blocking I/O operations in a one-shot worker
+   thread, with cancel semantics.
+
+   Unlike threadpool_*, io_thread will not 'fake it'; it is up to the caller
+   to figure out what to do if the system doesn't have threads. In
+   particular, the start_routine passed to io_thread_create will never be
+   called.
+
+   Clients of io_thread implement four functions:
+   - state *process_start(...);
+     Starts the worker thread.
+   - bool process_is_done(state *);
+     Returns true if the I/O operation is complete.
+   - void process_cancel(state *);
+     "Cancels" the I/O operation. The thread will continue to run, but it
+     will detach, and clean itself up upon completion.
+   - int process_finish(state *, ...)
+     Waits for the I/O operation to complete, returns results, and cleans up.
+
+   Or:        /---\
+             \/   |    /--> cancel
+   start -> is_done --+
+                       \--> finish
+
+   These functions follow a basic pattern:
+   - start:
+     1. Allocate a thread state object with thread_alloc. This state object
+        contains an io_thread member.
+     2. Save parameters from the start parameters to the state object.
+     3. Start the thread with _io_thread_create. The thread receives the state
+        object as its parameter.
+   - On the worker thread:
+     1. Do the I/O.
+     2. Call io_thread_return.
+       2a. If the result != 0, free the state object.
+   - is_done:
+     1. Just call _io_thread_is_done.
+   - cancel:
+     1. Call io_thread_cancel.
+       1a. If the result != 0, free the state object.
+   - finish:
+     1. Call io_thread_finish.
+     2. Copy results out of the state object as needed.
+     3. Free the state object...or return it to the caller.
+
+   Incidentally, there may sometimes be asynchronous versions of blocking I/O
+   functions (struct aiocb and friends, for example); these should be
+   preferred over io_thread when performance is a concern.
+ */
+
+enum _io_thread_status
+{
+       _io_thread_working, _io_thread_done, _io_thread_cancelled
+};
+
+struct io_thread
+{
+#if HAVE_PTHREAD
+       /* Common misconception: "volatile" should be applied to atomic variables,
+          such as 'status', below. This is false, see
+          <http://stackoverflow.com/q/2484980>. */
+       enum _io_thread_status status;
+       pthread_t thread;
+#else
+       char gcc_emits_a_warning_when_the_struct_has_no_members;
+#endif
+};
+
+#if HAVE_PTHREAD
+
+void *io_thread_create(struct io_thread *self, void *parent, void *(*start_routine)(void *), Display *dpy, unsigned stacksize);
+/*
+   Create the thread, returns NULL on failure.  Failure is usually due to
+   ENOMEM, or the system doesn't support threads.
+   self:          The io_thread object to be initialized.
+   parent:        The parameter to start_routine.  The io_thread should be
+                  contained within or be reachable from this.
+   start_routine: The start routine for the worker thread.
+   dpy:           The X11 Display, so that '*useThreads' is honored.
+   stacksize:     The stack size for the thread. Set to 0 for the system
+                  default.
+   A note about stacksize: Linux, for example, uses a default of 2 MB of
+   stack per thread. Now, this memory is usually committed on the first
+   write, so lots of threads won't waste RAM, but it does mean that on a
+   32-bit system, there's a limit of just under 1024 threads with the 2 MB
+   default due to typical address space limitations of 2 GB for userspace
+   processes.  And 1024 threads might not always be enough...
+ */
+
+int io_thread_return(struct io_thread *self);
+/* Called at the end of start_routine, from above. Returns non-zero if the
+   thread has been cancelled, and cleanup needs to take place. */
+
+int io_thread_is_done(struct io_thread *self);
+/* Call from the main thread. Returns non-zero if the thread finished. */
+
+int io_thread_cancel(struct io_thread *self);
+/* Call from the main thread if the results from the worker thread are not
+   needed. This cleans up the io_thread. Returns non-zero if cleanup needs
+   to take place. */
+
+void io_thread_finish(struct io_thread *self);
+/* Call from the main thread to wait for the worker thread to finish. This
+   cleans up the io_thread. */
+
+#else
+
+#define IO_THREAD_STACK_MIN 0
+
+#define io_thread_create(self, parent, start_routine, dpy, stacksize) NULL
+#define io_thread_return(self) 0
+#define io_thread_is_done(self) 1
+#define io_thread_cancel(self) 0
+#define io_thread_finish(self)
+
+#endif
+
 #if HAVE_PTHREAD
-#      define THREAD_DEFAULTS \
-       "*useThreads: True",
+#      define THREAD_DEFAULTS       "*useThreads: True",
+#      define THREAD_DEFAULTS_XLOCK "*useThreads: True\n"
 #      define THREAD_OPTIONS \
        {"-threads",    ".useThreads", XrmoptionNoArg, "True"}, \
        {"-no-threads", ".useThreads", XrmoptionNoArg, "False"},
 #else
 #      define THREAD_DEFAULTS
+#      define THREAD_DEFAULTS_XLOCK
 #      define THREAD_OPTIONS
 #endif
 
diff --git a/utils/utf8wc.c b/utils/utf8wc.c
new file mode 100644 (file)
index 0000000..e2db241
--- /dev/null
@@ -0,0 +1,827 @@
+/* xscreensaver, Copyright (c) 2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * 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 <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#ifdef HAVE_COCOA
+# include "jwxyz.h"
+# elif defined(HAVE_ANDROID)
+# include "jwxyz.h"
+#else /* !HAVE_COCOA */
+# include <X11/Xlib.h>
+#endif
+
+#include "utf8wc.h"
+
+
+/* "Unicode Replacement Character", displayed in lieu of invalid characters. */
+# define INVALID 0xFFFD
+
+
+/* Mask the number to be within the valid range of unicode characters.
+ */
+static unsigned long
+uc_truncate (unsigned long uc)
+{
+  uc &= 0x7FFFFFFFL;                   /* Unicode is 31 bits */
+  if (uc > 0x10FFFF) uc = INVALID;     /* But UTF-8 is 4 bytes */
+  if (uc == 0) uc = INVALID;           /* no nulls */
+
+  if (uc >= 0xD800 && uc <= 0xDFFF)
+    /* Reserved for use with UTF-16: not a real character. */
+    uc = INVALID;
+
+  return uc;
+}
+
+
+/* Parse the first UTF8 character at the front of the string.
+   Return the Unicode character, and the number of bytes read.
+ */
+static long
+utf8_decode (const unsigned char *in, long length, unsigned long *unicode_ret)
+{
+  const unsigned char *start = in;
+  const unsigned char *end = in + length;
+  unsigned long uc = INVALID;
+  unsigned long min = 0;
+  unsigned char c;
+
+  if (length <= 0) goto DONE;
+
+  c = *in++;
+
+# define PREMATURE_EOF { in = end; goto DONE; }
+
+  if ((c & 0xC0) == 0x80) {        /* 10xxxxxx - lonely continuation byte */
+    uc = INVALID;
+
+  } else if ((c & 0x80) == 0) {    /* 0xxxxxxx - 7 bits in 1 byte */
+    uc = (c & 0x7F);               /* 01111111 */
+
+  } else if ((c & 0xE0) == 0xC0) { /* 110xxxxx - 11 bits in 2 bytes */
+    if (in+1 > end) PREMATURE_EOF;
+    min = 1 << 7;
+    uc = (((c    & 0x1F) << 6) |   /* 00011111------ */
+          (in[0] & 0x3F));         /*       00111111 */
+    in += 1;
+
+  } else if ((c & 0xF0) == 0xE0) { /* 1110xxxx - 16 bits in 3 bytes */
+    if (in+2 > end) PREMATURE_EOF;
+    min = 1 << 11;
+    uc = (((c     & 0x0F) << 12) | /* 00001111----+------- */
+          ((in[0] & 0x3F) <<  6) | /*       00111111------ */
+          ((in[1] & 0x3F)));       /*             00111111 */
+    in += 2;
+
+  } else if ((c & 0xF8) == 0xF0) { /* 11110xxx - 21 bits in 4 bytes */
+    if (in+3 > end) PREMATURE_EOF;
+    min = 1 << 16;
+    uc = (((c     & 0x07) << 18) | /* 00000111--+-------+------- */
+          ((in[0] & 0x3F) << 12) | /*       01111111----+------- */
+          ((in[1] & 0x3F) <<  6) | /*             00111111------ */
+          ((in[2] & 0x3F)));       /*                   00111111 */
+    in += 3;
+
+  } else if ((c & 0xFC) == 0xF8) { /* 111110xx - 26 bits in 5 bytes */
+    if (in+4 > end) PREMATURE_EOF;
+    min = 1 << 21;
+    uc = (((c     & 0x03) << 24) | /* 00000011--------+-------+------- */
+          ((in[0] & 0x3F) << 18) | /*       00111111--+-------+------- */
+          ((in[1] & 0x3F) << 12) | /*             00111111----+------- */
+          ((in[2] & 0x3F) << 6)  | /*                   00111111------ */
+          ((in[3] & 0x3F)));       /*                         00111111 */
+    in += 4;
+
+  } else if ((c & 0xFE) == 0xFC) { /* 1111110x - 31 bits in 6 bytes */
+    if (in+5 > end) PREMATURE_EOF;
+    min = 1 << 26;
+    uc = (((c     & 0x01) << 30) | /* 00000001------+-------+-------+------- */
+          ((in[0] & 0x3F) << 24) | /*       00111111+-------+-------+------- */
+          ((in[1] & 0x3F) << 18) | /*             00111111--+-------+------- */
+          ((in[2] & 0x3F) << 12) | /*                   00111111----+------- */
+          ((in[3] & 0x3F) << 6)  | /*                         00111111------ */
+          ((in[4] & 0x3F)));       /*                               00111111 */
+    in += 5;
+  } else {
+    uc = INVALID;                 /* Unparsable sequence. */
+  }
+
+ DONE:
+
+  length = in - start;
+
+  /* If any of the continuation bytes didn't begin with the continuation tag,
+     the sequence is invalid; stop at the bad byte, not consuming later ones.
+     (It's easier to check this after the fact than up above.) */
+  {
+    int i;
+    for (i = 1; i < length; i++)
+      if ((start[i] & 0xC0) != 0x80) {
+        uc = INVALID;
+        length = i+1;
+        break;
+      }
+  }
+
+  if (uc < min)
+    /* A multi-byte sequence encoded a character that could have been
+       encoded with a shorter sequence, e.g., hiding ASCII inside a
+       multi-byte sequence. Something hinky's going on. Reject it. */
+    uc = INVALID;
+
+  uc = uc_truncate (uc);
+
+  if (unicode_ret)
+    *unicode_ret = uc;
+
+  return length;
+}
+
+
+/* Converts a Unicode character to a multi-byte UTF8 sequence.
+   Returns the number of bytes written.
+ */
+static int
+utf8_encode (unsigned long uc, char *out, long length)
+{
+  const char *old = out;
+
+  uc = uc_truncate (uc);
+
+  if (uc < 0x80 && length >= 1)                        /* 7 bits in 1 byte */
+    {
+      *out++ = uc;                             /* 0xxxxxxx */
+    }
+  else if (uc < 0x800 && length >= 2)          /* 11 bits in 2 bytes */
+    {
+      *out++ = (0xC0 | ((uc >> 6)  & 0x1F));   /* 110xxxxx */
+      *out++ = (0x80 |  (uc        & 0x3F));   /* 10xxxxxx */
+    }
+  else if (uc < 0x10000L && length >= 3)       /* 16 bits in 3 bytes */
+    {
+      *out++ = (0xE0 | ((uc >> 12) & 0x0F));   /* 1110xxxx */
+      *out++ = (0x80 | ((uc >>  6) & 0x3F));   /* 10xxxxxx */
+      *out++ = (0x80 |  (uc        & 0x3F));   /* 10xxxxxx */
+    }
+  else if (uc < 0x200000L && length >= 4)      /* 21 bits in 4 bytes */
+    {
+      *out++ = (0xF0 | ((uc >> 18) & 0x07));   /* 11110xxx */
+      *out++ = (0x80 | ((uc >> 12) & 0x3F));   /* 10xxxxxx */
+      *out++ = (0x80 | ((uc >>  6) & 0x3F));   /* 10xxxxxx */
+      *out++ = (0x80 |  (uc        & 0x3F));   /* 10xxxxxx */
+    } 
+  else if (uc < 0x4000000L && length >= 5)     /* 26 bits in 5 bytes */
+    {
+      *out++ = (0xF8 | ((uc >> 24) & 0x03));   /* 111110xx */
+      *out++ = (0x80 | ((uc >> 18) & 0x3F));   /* 10xxxxxx */
+      *out++ = (0x80 | ((uc >> 12) & 0x3F));   /* 10xxxxxx */
+      *out++ = (0x80 | ((uc >>  6) & 0x3F));   /* 10xxxxxx */
+      *out++ = (0x80 |  (uc        & 0x3F));   /* 10xxxxxx */
+    }
+  else if (length >= 6)                                /* 31 bits in 6 bytes */
+    {
+      *out++ = (0xFC | ((uc >> 30) & 0x01));   /* 1111110x */
+      *out++ = (0x80 | ((uc >> 24) & 0x3F));   /* 10xxxxxx */
+      *out++ = (0x80 | ((uc >> 18) & 0x3F));   /* 10xxxxxx */
+      *out++ = (0x80 | ((uc >> 12) & 0x3F));   /* 10xxxxxx */
+      *out++ = (0x80 | ((uc >>  6) & 0x3F));   /* 10xxxxxx */
+      *out++ = (0x80 |  (uc        & 0x3F));   /* 10xxxxxx */
+    }
+
+  return (int) (out - old);
+}
+
+
+/* Converts a null-terminated UTF8 string to a null-terminated XChar2b array.
+   This only handles characters that can be represented in 16 bits, the
+   Basic Multilingual Plane. (No hieroglyphics, Elvish, Klingon or Emoji.)
+ */
+XChar2b *
+utf8_to_XChar2b (const char *string, int *length_ret)
+{
+  long in_len = strlen(string);
+  const unsigned char *in = (const unsigned char *) string;
+  const unsigned char *in_end = in + in_len;
+  XChar2b *c2b = (XChar2b *) malloc ((in_len + 1) * sizeof(*c2b));
+  XChar2b *out = c2b;
+  if (! out) return 0;
+
+  while (in < in_end)
+    {
+      unsigned long uc = 0;
+      long L = utf8_decode (in, in_end - in, &uc);
+      in += L;
+
+      /* If it can't be represented in a 16-bit XChar2b,
+         use "Unicode Replacement Character". */
+      if (uc > 0xFFFF) uc = INVALID;
+
+      out->byte1 = (uc >> 8) & 0xFF;
+      out->byte2 = uc & 0xFF;
+      out++;
+    }
+
+  out->byte1 = 0;
+  out->byte2 = 0;
+
+  /* shrink */
+  c2b = (XChar2b *) realloc (c2b, (out - c2b + 1) * sizeof(*c2b));
+
+  if (length_ret)
+    *length_ret = (int) (out - c2b);
+
+  return c2b;
+}
+
+
+/* Split a UTF8 string into an array of strings, one per character.
+   The sub-strings will be null terminated and may be multiple bytes.
+ */
+char **
+utf8_split (const char *string, int *length_ret)
+{
+  const unsigned char *in = (const unsigned char *) string;
+  long len = strlen (string);
+  const unsigned char *end = in + len;
+  char **ret = (char **) malloc ((len+1) * sizeof(*ret));
+  int i = 0;
+  if (!ret) return 0;
+
+  while (in < end)
+    {
+      long len2 = utf8_decode (in, len, 0);
+      char tmp[10];
+      strncpy (tmp, (char *) in, len2);
+      tmp[len2] = 0;
+      ret[i++] = strdup (tmp);
+      in += len2;
+    }
+  ret[i] = 0;
+
+  /* shrink */
+  ret = (char **) realloc (ret, (i+1) * sizeof(*ret));
+
+  if (length_ret)
+    *length_ret = i;
+
+  return ret;
+}
+
+
+/* Converts a null-terminated XChar2b array to a null-terminated UTF8 string.
+ */
+char *
+XChar2b_to_utf8 (const XChar2b *in, int *length_ret)
+{
+  int in_len = 0;
+  const XChar2b *in_end;
+  int out_len;
+  char *utf8, *out;
+  const char *out_end;
+
+  /* Find the null termination on the XChar2b. */
+  for (in_end = in; in_end->byte1 || in_end->byte2; in_end++, in_len++)
+    ;
+
+  out_len = (in_len + 1) * 3;             /* 16 bit chars = 3 bytes max */
+  utf8 = out = (char *) malloc (out_len + 1);
+  if (! out) return 0;
+  out_end = out + out_len;
+
+  while (in < in_end)
+    {
+      unsigned long uc = (in->byte1 << 8) | in->byte2;
+      int wrote = utf8_encode (uc, out, out_end - out);
+      if (wrote > 3) abort();  /* Can't happen with 16 bit input */
+      out += wrote;
+      in++;
+    }
+  *out = 0;
+
+  /* shrink */
+  utf8 = (char *) realloc (utf8, (out - utf8 + 1) * sizeof(*utf8));
+
+  if (length_ret)
+    *length_ret = (int) (out - utf8);
+
+  return utf8;
+}
+
+
+/* Converts a UTF8 string to the closest Latin1 or ASCII equivalent.
+ */
+char *
+utf8_to_latin1 (const char *string, Bool ascii_p)
+{
+  long in_len = strlen(string);
+  const unsigned char *in = (const unsigned char *) string;
+  const unsigned char *in_end = in + in_len;
+  unsigned char *ret = (unsigned char *) malloc (in_len + 1);
+  unsigned char *out = ret;
+
+  if (! ret) return 0;
+
+  while (in < in_end)
+    {
+      unsigned long uc = 0;
+      long len2 = utf8_decode (in, in_end - in, &uc);
+      in += len2;
+
+      if (uc > 0xFF)
+        switch (uc) {
+
+        /* Map "Unicode General Punctuation Block" to Latin1 equivalents. */
+
+        case 0x2000:   /* EN QUAD */
+        case 0x2001:   /* EM QUAD */
+        case 0x2002:   /* EN SPACE */
+        case 0x2003:   /* EM SPACE */
+        case 0x2004:   /* THREE-PER-EM SPACE */
+        case 0x2005:   /* FOUR-PER-EM SPACE */
+        case 0x2006:   /* SIX-PER-EM SPACE */
+        case 0x2007:   /* FIGURE SPACE */
+        case 0x2008:   /* PUNCTUATION SPACE */
+        case 0x2009:   /* THIN SPACE */
+        case 0x200A:   /* HAIR SPACE */
+          uc = ' ';
+         break;
+
+        case 0x2010:   /* HYPHEN */
+        case 0x2011:   /* NON-BREAKING HYPHEN */
+        case 0x2012:   /* FIGURE DASH */
+        case 0x2013:   /* EN DASH */
+        case 0x2014:   /* EM DASH */
+        case 0x2015:   /* HORIZONTAL BAR */
+          uc = '-';
+         break;
+
+        case 0x2018:   /* LEFT SINGLE QUOTATION MARK */
+        case 0x2019:   /* SINGLE LOW-9 QUOTATION MARK */
+        case 0x201A:   /* SINGLE LOW-9 QUOTATION MARK */
+        case 0x201B:   /* SINGLE HIGH-REVERSED-9 QUOTATION MARK */
+          uc = '\'';
+         break;
+
+        case 0x201C:   /* LEFT DOUBLE QUOTATION MARK */
+        case 0x201D:   /* RIGHT DOUBLE QUOTATION MARK */
+        case 0x201E:   /* DOUBLE LOW-9 QUOTATION MARK */
+        case 0x201F:   /* DOUBLE HIGH-REVERSED-9 QUOTATION MARK */
+          uc = '"';
+         break;
+
+        case 0x2022: uc = '\267'; break; /* BULLET */
+        case 0x2023: uc = '\273'; break; /* TRIANGULAR BULLET */
+        case 0x2027: uc = '\267'; break; /* HYPHENATION POINT */
+        case 0x202F: uc = ' ';   break; /* NARROW NO-BREAK SPACE */
+        case 0x2038: uc = '^';   break; /* CARET */
+        case 0x2039: uc = '\253'; break; /* SINGLE LEFT ANGLE QUOTATION MARK */
+        case 0x203A: uc = '\273'; break; /* SINGLE RIGHT ANGLE QUOTATION MARK*/
+        case 0x2041: uc = '^';   break; /* CARET INSERTION POINT */
+        case 0x2042: uc = '*';   break; /* ASTERISM */
+        case 0x2043: uc = '=';   break; /* HYPHEN BULLET */
+        case 0x2044: uc = '/';   break; /* FRACTION SLASH */
+        case 0x204B: uc = '\266'; break; /* REVERSED PILCROW SIGN */
+        case 0x204C: uc = '\267'; break; /* BLACK LEFTWARDS BULLET */
+        case 0x204D: uc = '\267'; break; /* BLACK RIGHTWARDS BULLET */
+        case 0x204E: uc = '*';   break; /* LOW ASTERISK */
+        case 0x204F: uc = ';';   break; /* REVERSED SEMICOLON */
+        default:
+          break;
+        }
+      else if (uc >= 0x2300 && uc <= 0x36F)
+        uc = 0;                /* Discard "Unicode Combining Diacriticals Block" */
+      else if (uc == '\240')
+        uc = ' ';      /* &nbsp; */
+
+      if (uc > 0xFF)
+        /* "Inverted question mark" looks enough like 0xFFFD,
+           the "Unicode Replacement Character". */
+        uc = (ascii_p ? '#' : 0xBF);
+
+      if (ascii_p)     /* Map Latin1 to the closest ASCII versions. */
+        {
+          const unsigned char latin1_to_ascii[96] =
+             " !C##Y|S_C#<=-R_##23'uP.,1o>###?"
+             "AAAAAAECEEEEIIIIDNOOOOOx0UUUUYpS"
+             "aaaaaaeceeeeiiiionooooo/ouuuuypy";
+          if (uc >= 0xA0)
+            uc = latin1_to_ascii[uc - 0xA0];
+        }
+
+      if (uc > 0)
+        *out++ = (unsigned char) uc;
+    }
+  *out = 0;
+
+  /* shrink */
+  ret = (unsigned char *) realloc (ret, (out - ret + 1) * sizeof(*ret));
+
+  return (char *) ret;
+}
+
+
+/*************************************************************************
+
+ cd ../hacks ; make test-utf8wc
+
+ *************************************************************************/
+
+#ifdef SELFTEST
+
+/* Convert a UTF8 string to Unicode and back again.
+ */
+static char *
+split_and_join (const char *string)
+{
+  const unsigned char *in = (const unsigned char *) string;
+  int len = strlen (string);
+  const unsigned char *end = in + len;
+  unsigned long *unicode = (unsigned long *)
+    malloc((len + 1) * sizeof(*unicode));
+  int i = 0;
+  char *ret, *out, *out_end;
+
+  while (in < end)
+    {
+      long len2 = utf8_decode (in, len, &unicode[i]);
+      i++;
+      in += len2;
+    }
+  unicode[i] = 0;
+
+  i = i*6 + 1;
+  out = ret = (char *) malloc(i);
+  out_end = out + i;
+  i = 0;
+  while (unicode[i])
+    {
+      int len2 = utf8_encode (unicode[i], out, out_end - out);
+      out += len2;
+      i++;
+    }
+  *out = 0;
+  free (unicode);
+
+  return ret;
+}
+
+
+static void
+LOG (FILE *out, const char *prefix, const char *s)
+{
+  fprintf (out, "%6s: \"", prefix);
+  while (*s)
+    {
+      unsigned char c = *s;
+      if (c == '"' || c == '\\') fprintf(out, "\\%c", c);
+      else if (c < 32 || c >= 127) fprintf(out, "\\%03o", c);
+      else fprintf (out, "%c", c);
+      s++;
+    }
+  fprintf (out, "\"\n");
+}
+
+
+int
+main (int argc, char **argv)
+{
+  /* Adapted from http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
+   */
+
+#  define URC "\357\277\275"   /* 0xFFFD, "Unicode Replacement Character" */
+
+  static const struct { const char *name, *in, *target, *target2; } tests[] = {
+    /* 1  Some correct UTF-8 text */
+
+    /* The Greek word 'kosme': */
+    { "1", "\316\272\341\275\271\317\203\316\274\316\265" },
+
+
+    /* 2  Boundary condition test cases */
+
+    /* 2.1  First possible sequence of a certain length */
+
+    { "2.1.1", /*  1 byte  (U-00000000): */  "\000" },
+    { "2.1.2", /*  2 bytes (U-00000080): */  "\302\200" },
+    { "2.1.3", /*  3 bytes (U-00000800): */  "\340\240\200" },
+    { "2.1.4", /*  4 bytes (U-00010000): */  "\360\220\200\200", 0, URC },
+    { "2.1.5", /*  5 bytes (U-00200000): */  "\370\210\200\200\200", URC },
+    { "2.1.6", /*  6 bytes (U-04000000): */  "\374\204\200\200\200\200", URC },
+
+    /* 2.2  Last possible sequence of a certain length */
+
+    { "2.2.1", /*  1 byte  (U-0000007F): */  "\177" },
+    { "2.2.2", /*  2 bytes (U-000007FF): */  "\337\277" },
+    { "2.2.3", /*  3 bytes (U-0000FFFF): */  "\357\277\277" },
+    { "2.2.4", /*  4 bytes (U-001FFFFF): */  "\367\277\277\277", URC },
+    { "2.2.5", /*  5 bytes (U-03FFFFFF): */  "\373\277\277\277\277", URC },
+    { "2.2.6", /*  6 bytes (U-7FFFFFFF): */  "\375\277\277\277\277\277", URC },
+
+    /* 2.3  Other boundary conditions */
+
+    { "2.3.1", /*  U-0000D7FF = ed 9f bf = */   "\355\237\277" },
+    { "2.3.2", /*  U-0000E000 = ee 80 80 = */   "\356\200\200" },
+    { "2.3.3", /*  U-0000FFFD = ef bf bd = */   URC },
+    { "2.3.4", /*  U-0010FFFF = f4 8f bf bf = */ "\364\217\277\277", 0, URC },
+    { "2.3.5", /*  U-00110000 = f4 90 80 80 = */ "\364\220\200\200", URC },
+
+
+    /* 3  Malformed sequences */
+
+    /* 3.1  Unexpected continuation bytes */
+
+    /* Each unexpected continuation byte should be separately signalled as a
+       malformed sequence of its own. */
+
+    { "3.1.1", /*  First continuation byte 0x80: */ "\200", URC },
+    { "3.1.2", /*  Last  continuation byte 0xbf: */ "\277", URC },
+    { "3.1.3", /*  2 continuation bytes: */ "\200\277",     URC URC },
+    { "3.1.4", /*  3 continuation bytes: */ "\200\277\200", URC URC URC },
+    { "3.1.5", /*  4 continuation bytes: */ "\200\277\200\277",
+      URC URC URC URC },
+    { "3.1.6", /*  5 continuation bytes: */ "\200\277\200\277\200",
+      URC URC URC URC URC },
+    { "3.1.7", /*  6 continuation bytes: */ "\200\277\200\277\200\277",
+      URC URC URC URC URC URC },
+    { "3.1.8", /*  7 continuation bytes: */ "\200\277\200\277\200\277\200",
+      URC URC URC URC URC URC URC },
+
+    { "3.1.9", /* Sequence of all 64 possible continuation bytes (0x80-0xbf):*/
+
+      "\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217"
+      "\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237"
+      "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257"
+      "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277",
+      URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC
+      URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC
+      URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC
+      URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC },
+
+    /* 3.2  Lonely start characters */
+
+    { "3.2.1", /*  All 32 first bytes of 2-byte sequences (0xc0-0xdf),
+                   each followed by a space character: */
+
+      "\300 \301 \302 \303 \304 \305 \306 \307 \310 \311 \312 \313 \314 "
+      "\315 \316 \317 \320 \321 \322 \323 \324 \325 \326 \327 \330 \331 "
+      "\332 \333 \334 \335 \336 \337 ",
+      URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC
+      URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC },
+
+    { "3.2.2", /*  All 16 first bytes of 3-byte sequences (0xe0-0xef),
+                   each followed by a space character: */
+      "\340 \341 \342 \343 \344 \345 \346 \347 "
+      "\350 \351 \352 \353 \354 \355 \356 \357 ",
+      URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC },
+
+    { "3.2.3", /*  All 8 first bytes of 4-byte sequences (0xf0-0xf7),
+                   each followed by a space character: */
+      URC URC URC URC URC URC URC URC },
+
+    { "3.2.4", /*  All 4 first bytes of 5-byte sequences (0xf8-0xfb),
+                   each followed by a space character: */
+      "\370 \371 \372 \373 ",
+      URC URC URC URC },
+
+    { "3.2.5", /*  All 2 first bytes of 6-byte sequences (0xfc-0xfd),
+                   each followed by a space character: */
+      "\374 \375 ", URC URC },
+
+    /* 3.3  Sequences with last continuation byte missing */
+
+    /* All bytes of an incomplete sequence should be signalled as a single
+       malformed sequence, i.e., you should see only a single replacement
+       character in each of the next 10 tests. (Characters as in section 2) */
+
+    { "3.3.1", /*  2-byte sequence with last byte missing (U+0000): */
+      "\300", URC },
+    { "3.3.2", /*  3-byte sequence with last byte missing (U+0000): */
+      "\340\200", URC },
+    { "3.3.3", /*  4-byte sequence with last byte missing (U+0000): */
+      "\360\200\200", URC },
+    { "3.3.4", /*  5-byte sequence with last byte missing (U+0000): */
+      "\370\200\200\200", URC },
+    { "3.3.5", /*  6-byte sequence with last byte missing (U+0000): */
+      "\374\200\200\200\200", URC },
+    { "3.3.6", /*  2-byte sequence with last byte missing (U-000007FF): */
+      "\337", URC },
+    { "3.3.7", /*  3-byte sequence with last byte missing (U-0000FFFF): */
+      "\357\277", URC },
+    { "3.3.8", /*  4-byte sequence with last byte missing (U-001FFFFF): */
+      "\367\277\277", URC },
+    { "3.3.9", /*  5-byte sequence with last byte missing (U-03FFFFFF): */
+      "\373\277\277\277", URC },
+    { "3.3.10", /* 6-byte sequence with last byte missing (U-7FFFFFFF): */
+      "\375\277\277\277\277", URC },
+
+    /* 3.4  Concatenation of incomplete sequences */
+
+    /* All the 10 sequences of 3.3 concatenated, you should see 10 malformed
+       sequences being signalled: */
+
+    { "3.4",   "\300\340\200\360\200\200\370\200\200\200\374\200\200\200\200"
+      "\337\357\277\367\277\277\373\277\277\277\375\277\277\277\277",
+      URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC },
+
+    /* 3.5  Impossible bytes */
+
+    /* The following two bytes cannot appear in a correct UTF-8 string */
+
+    { "3.5.1", /*  fe = */     "\376", URC },
+    { "3.5.2", /*  ff = */     "\377", URC },
+    { "3.5.3", /*  fe fe ff ff = */    "\376\376\377\377", URC URC URC URC },
+
+
+    /* 4  Overlong sequences */
+
+    /* 4.1  Examples of an overlong ASCII character */
+
+    { "4.1.1", /* U+002F = c0 af             = */ "\300\257", URC },
+    { "4.1.2", /* U+002F = e0 80 af          = */ "\340\200\257", URC },
+    { "4.1.3", /* U+002F = f0 80 80 af       = */ "\360\200\200\257", URC },
+    { "4.1.4", /* U+002F = f8 80 80 80 af    = */ "\370\200\200\200\257",
+      URC },
+    { "4.1.5", /* U+002F = fc 80 80 80 80 af = */ "\374\200\200\200\200\257",
+      URC },
+
+    /* 4.2  Maximum overlong sequences */
+
+    { "4.2.1", /*  U-0000007F = c1 bf             = */ "\301\277", URC },
+    { "4.2.2", /*  U-000007FF = e0 9f bf          = */ "\340\237\277", URC },
+    { "4.2.3", /*  U-0000FFFF = f0 8f bf bf       = */ "\360\217\277\277",
+      URC },
+    { "4.2.4", /*  U-001FFFFF = f8 87 bf bf bf    = */ "\370\207\277\277\277",
+      URC },
+    { "4.2.5", /*  U-03FFFFFF = fc 83 bf bf bf bf = */  URC },
+
+    /* 4.3  Overlong representation of the NUL character */
+
+    { "4.3.1", /*  U+0000 = c0 80             = */  "\300\200", URC },
+    { "4.3.2", /*  U+0000 = e0 80 80          = */  "\340\200\200", URC },
+    { "4.3.3", /*  U+0000 = f0 80 80 80       = */  "\360\200\200\200", URC },
+    { "4.3.4", /*  U+0000 = f8 80 80 80 80    = */  "\370\200\200\200\200",
+      URC },
+    { "4.3.5", /*  U+0000 = fc 80 80 80 80 80 = */  "\374\200\200\200\200\200",
+      URC },
+
+
+    /* 5  Illegal code positions */
+
+    /* 5.1 Single UTF-16 surrogates */
+
+    { "5.1.1", /*  U+D800 = ed a0 80 = */      "\355\240\200", URC },
+    { "5.1.2", /*  U+DB7F = ed ad bf = */      "\355\255\277", URC },
+    { "5.1.3", /*  U+DB80 = ed ae 80 = */      "\355\256\200", URC },
+    { "5.1.4", /*  U+DBFF = ed af bf = */      "\355\257\277", URC },
+    { "5.1.5", /*  U+DC00 = ed b0 80 = */      "\355\260\200", URC },
+    { "5.1.6", /*  U+DF80 = ed be 80 = */      "\355\276\200", URC },
+    { "5.1.7", /*  U+DFFF = ed bf bf = */      "\355\277\277", URC },
+
+    /* 5.2 Paired UTF-16 surrogates */
+
+    { "5.2.1", /*  U+D800 U+DC00 = ed a0 80 ed b0 80 = */ URC URC },
+    { "5.2.2", /*  U+D800 U+DFFF = ed a0 80 ed bf bf = */ URC URC },
+    { "5.2.3", /*  U+DB7F U+DC00 = ed ad bf ed b0 80 = */ URC URC },
+    { "5.2.4", /*  U+DB7F U+DFFF = ed ad bf ed bf bf = */ URC URC },
+    { "5.2.5", /*  U+DB80 U+DC00 = ed ae 80 ed b0 80 = */ URC URC },
+    { "5.2.6", /*  U+DB80 U+DFFF = ed ae 80 ed bf bf = */ URC URC },
+    { "5.2.7", /*  U+DBFF U+DC00 = ed af bf ed b0 80 = */ URC URC },
+    { "5.2.8", /*  U+DBFF U+DFFF = ed af bf ed bf bf = */ URC URC },
+
+    /* 5.3 Other illegal code positions */
+
+    { "5.3.1", /*  U+FFFE = ef bf be = */      "\357\277\276" },
+    { "5.3.2", /*  U+FFFF = ef bf bf = */      "\357\277\277" },
+
+
+    /* 6 Some other junk */
+
+    { "6.0", "" },
+    { "6.1", "\001\002\003\004\005 ABC" },
+    { "6.2", /* every non-ASCII Latin1 character */
+      "\302\241\302\242\302\243\302\244\302\245\302\246\302\247\302\250"
+      "\302\251\302\252\302\253\302\254\302\255\302\256\302\257\302\260"
+      "\302\261\302\262\302\263\302\264\302\265\302\266\302\267\302\270"
+      "\302\271\302\272\302\273\302\274\302\275\302\276\302\277\303\200"
+      "\303\201\303\202\303\203\303\204\303\205\303\206\303\207\303\210"
+      "\303\211\303\212\303\213\303\214\303\215\303\216\303\217\303\220"
+      "\303\221\303\222\303\223\303\224\303\225\303\226\303\227\303\230"
+      "\303\231\303\232\303\233\303\234\303\235\303\236\303\237\303\240"
+      "\303\241\303\242\303\243\303\244\303\245\303\246\303\247\303\250"
+      "\303\251\303\252\303\253\303\254\303\255\303\256\303\257\303\260"
+      "\303\261\303\262\303\263\303\264\303\265\303\266\303\267\303\270"
+      "\303\271\303\272\303\273\303\274\303\275\303\276\303\277" },
+
+    { "6.3", /* Christmas tree */
+      "\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020"
+      "\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040"
+      "\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060"
+      "\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100"
+      "\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120"
+      "\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140"
+      "\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160"
+      "\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200"
+      "\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220"
+      "\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240"
+      "\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260"
+      "\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300"
+      "\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320"
+      "\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340"
+      "\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360"
+      "\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377",
+
+      "\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020"
+      "\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+      " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+      "[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\177"
+      URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC
+      URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC
+      URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC
+      URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC
+      URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC URC
+      URC URC URC URC URC URC URC URC URC URC URC URC },
+  };
+
+  int i;
+  int ok = 1;
+  for (i = 0; i < sizeof(tests)/sizeof(*tests); i++)
+    {
+      const char *name = tests[i].name;
+      const char *in   = tests[i].in;
+      const char *target = (tests[i].target ? tests[i].target : in);
+      const char *target2 = (tests[i].target2 ? tests[i].target2 : target);
+      char *out = split_and_join (in);
+      XChar2b *out16 = utf8_to_XChar2b (in, 0);
+      char *out2 = XChar2b_to_utf8 (out16, 0);
+      if (strcmp (out, target))
+        {
+          LOG (stderr, name, target);
+          LOG (stderr, "FAIL", out);
+          fprintf (stderr, "\n");
+          ok = 0;
+        }
+      if (strcmp (out2, target2))
+        {
+          LOG (stderr, name, target2);
+          LOG (stderr, "FAIL2", out2);
+          fprintf (stderr, "\n");
+          ok = 0;
+        }
+      free (out);
+      free (out2);
+      free (out16);
+    }
+
+  {
+    const char *utf8 = ("son \303\256le int\303\251rieure, \303\240 "
+                        "c\303\264t\303\251 de l'alc\303\264ve "
+                        "ovo\303\257de, o\303\271 les b\303\273ches "
+                        "se consument dans l'\303\242tre");
+    const char *latin1 = ("son \356le int\351rieure, \340 "
+                          "c\364t\351 de l'alc\364ve ovo\357de, "
+                          "o\371 les b\373ches se consument dans "
+                          "l'\342tre");
+    const char *ascii = ("son ile interieure, a cote de l'alcove "
+                         "ovoide, ou les buches se consument dans "
+                         "l'atre");
+    char *latin1b = utf8_to_latin1 (utf8, False);
+    char *ascii2  = utf8_to_latin1 (utf8, True);
+    if (strcmp (latin1, latin1b))
+      {
+        LOG (stderr, "LATIN1", utf8);
+        LOG (stderr, "FAIL3", latin1b);
+        fprintf (stderr, "\n");
+        ok = 0;
+      }
+    if (strcmp (ascii, ascii2))
+      {
+        LOG (stderr, "ASCII", utf8);
+        LOG (stderr, "FAIL4", ascii2);
+        fprintf (stderr, "\n");
+        ok = 0;
+      }
+    free (latin1b);
+    free (ascii2);
+  }
+
+
+  if (ok) fprintf (stderr, "OK\n");
+  return (ok == 0);
+}
+
+#endif /* SELFTEST */
diff --git a/utils/utf8wc.h b/utils/utf8wc.h
new file mode 100644 (file)
index 0000000..563f779
--- /dev/null
@@ -0,0 +1,36 @@
+/* xscreensaver, Copyright (c) 2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * 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_UTF8WC_H__
+#define __XSCREENSAVER_UTF8WC_H__
+
+/* Utilities for converting between UTF8 and XChar2b. */
+
+/* Converts a null-terminated UTF8 string to a null-terminated XChar2b array.
+   This only handles characters that can be represented in 16 bits, the
+   Basic Multilingual Plane. (No hieroglyphics, Elvish, Klingon or Emoji.)
+ */
+extern XChar2b * utf8_to_XChar2b (const char *, int *length_ret);
+
+/* Converts a null-terminated XChar2b array to a null-terminated UTF8 string.
+ */
+extern char *    XChar2b_to_utf8 (const XChar2b *, int *length_ret);
+
+/* Split a UTF8 string into an array of strings, one per character.
+   The sub-strings will be null terminated and may be multiple bytes.
+ */
+extern char ** utf8_split (const char *string, int *length_ret);
+
+/* Converts a UTF8 string to the closest Latin1 or ASCII equivalent.
+ */
+extern char *utf8_to_latin1 (const char *string, Bool ascii_p);
+
+#endif /* __XSCREENSAVER_UTF8WC_H__ */
index 5df4ac996fd009540f372cf9d059389fa8c5b270..52c12e04a9935c717cfff9f3fc7f149a8522c7e0 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1997, 2006 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1997-2014 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -18,9 +18,9 @@
 #include <string.h>
 #include <math.h>
 
-#ifdef HAVE_COCOA
+#if defined(HAVE_COCOA) || defined(HAVE_ANDROID)
 # include "jwxyz.h"
-#else /* !HAVE_COCOA - real X11 */
+#else /* real X11 */
 # include <X11/Xlib.h>
 # include <X11/Xutil.h>
 # include <X11/Xos.h>
index 32366d2b5ad20754458debee67c203a61009073b..998fde8325b1b522ee6b64da49d6198099de76c1 100644 (file)
@@ -1,2 +1,2 @@
 static const char screensaver_id[] =
-       "@(#)xscreensaver 5.30 (10-Sep-2014), by Jamie Zawinski (jwz@jwz.org)";
+       "@(#)xscreensaver 5.31 (15-Nov-2014), by Jamie Zawinski (jwz@jwz.org)";
diff --git a/utils/xft.c b/utils/xft.c
new file mode 100644 (file)
index 0000000..690586d
--- /dev/null
@@ -0,0 +1,339 @@
+/* xscreensaver, Copyright (c) 2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * 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.
+ */
+
+/* Compatibility layer using XDrawString, XDrawString16() or Xutf8DrawString().
+   This layer is used by X11 systems without Xft, and by MacOS / iOS.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifndef HAVE_XFT
+
+# include "utils.h"
+# include "resources.h"
+# include "xft.h"
+# include "utf8wc.h"
+
+extern const char *progname;
+
+struct _XftDraw {
+  Display   *dpy;
+  Drawable  drawable;
+  GC gc;
+  unsigned long pixel;
+  Font fid;
+  Visual *visual;
+  Colormap  colormap;
+};
+
+
+XftFont *
+XftFontOpenXlfd (Display *dpy, int screen, _Xconst char *xlfd)
+{
+  XftFont *ff = (XftFont *) calloc (1, sizeof(*ff));
+
+  if (!dpy || !xlfd) abort();
+  if (!ff) return 0;
+  ff->xfont = XLoadQueryFont (dpy, xlfd);
+  if (!ff->xfont)
+    {
+      free (ff);
+      return 0;
+    }
+
+  ff->name = strdup (xlfd);
+  ff->ascent  = ff->xfont->ascent;
+  ff->descent = ff->xfont->descent;
+  ff->height = ff->ascent + ff->descent;
+
+# ifdef HAVE_XUTF8DRAWSTRING
+  {
+    char **missing_charset_list_return;
+    int missing_charset_count_return;
+    char *def_string_return;
+
+    char *ss = (char *) malloc (strlen(xlfd) + 10);
+    strcpy (ss, xlfd);
+    strcat (ss, ",*");
+    ff->fontset = XCreateFontSet (dpy, ss,
+                                  &missing_charset_list_return,
+                                  &missing_charset_count_return,
+                                  &def_string_return);
+
+# if 0
+    {
+      int i;
+      for (i = 0; i < missing_charset_count_return; i++)
+        fprintf (stderr, "%s: missing charset: %s\n",
+                 ss, missing_charset_list_return[i]);
+    }
+# endif
+
+    /* Apparently this is not to be freed. */
+    /* if (def_string_return) XFree (def_string_return); */
+
+    if (missing_charset_list_return)
+      XFreeStringList (missing_charset_list_return);
+
+    free (ss);
+  }
+# endif
+
+  return ff;
+}
+
+
+void
+XftFontClose (Display *dpy, XftFont *font)
+{
+  if (!dpy || !font) abort();
+  free (font->name);
+  XFreeFont (dpy, font->xfont);
+# ifdef HAVE_XUTF8DRAWSTRING
+  XFreeFontSet (dpy, font->fontset);
+# endif
+  free (font);
+}
+
+
+Bool
+XftColorAllocName (Display  *dpy,
+                  _Xconst Visual *visual,
+                  Colormap cmap,
+                  _Xconst char *name,
+                  XftColor *result)
+{
+  XColor color;
+  if (!dpy || !visual || !name || !result) abort();
+
+  if (! XParseColor (dpy, cmap, name, &color))
+    {
+      fprintf (stderr, "%s: can't parse color %s", progname, name);
+      return False;
+    }
+  else if (! XAllocColor (dpy, cmap, &color))
+    {
+      fprintf (stderr, "%s: couldn't allocate color %s", progname, name);
+      return False;
+    }
+  else
+    {
+      XRenderColor color2;
+      color2.red    = color.red;
+      color2.green  = color.green;
+      color2.blue   = color.blue;
+      color2.alpha  = 0xFFFF;
+      XftColorAllocValue (dpy, visual, cmap, &color2, result);
+      result->pixel = color.pixel;
+      return True;
+    }
+}
+
+
+static short
+maskbase (unsigned long m)
+{
+  short i;
+  if (!m)
+    return 0;
+  i = 0;
+  while (! (m&1))
+    {
+      m >>= 1;
+      i++;
+    }
+  return i;
+}
+
+
+static short
+masklen (unsigned long m)
+{
+  unsigned long y;
+  y = (m >> 1) & 033333333333;
+  y = m - y - ((y >>1) & 033333333333);
+  return (short) (((y + (y >> 3)) & 030707070707) % 077);
+}
+
+
+Bool
+XftColorAllocValue (Display *dpy,
+                   _Xconst Visual *visual,
+                   Colormap cmap,
+                   _Xconst XRenderColor *color,
+                   XftColor *result)
+{
+  if (!dpy || !visual || !color || !result) abort();
+  if (visual->class == TrueColor)
+    {
+      int red_shift, red_len;
+      int green_shift, green_len;
+      int blue_shift, blue_len;
+
+      red_shift   = maskbase (visual->red_mask);
+      red_len     = masklen  (visual->red_mask);
+      green_shift = maskbase (visual->green_mask);
+      green_len   = masklen (visual->green_mask);
+      blue_shift  = maskbase (visual->blue_mask);
+      blue_len    = masklen (visual->blue_mask);
+      result->pixel = (((color->red   >> (16 - red_len))   << red_shift)   |
+                       ((color->green >> (16 - green_len)) << green_shift) |
+                       ((color->blue  >> (16 - blue_len))  << blue_shift));
+# ifdef HAVE_COCOA
+      result->pixel |= BlackPixel(dpy, 0);  /* alpha */
+# endif
+    }
+  else
+    {
+      XColor xcolor;
+      xcolor.red   = color->red;
+      xcolor.green = color->green;
+      xcolor.blue  = color->blue;
+      if (!XAllocColor (dpy, cmap, &xcolor))
+        return False;
+      result->pixel = xcolor.pixel;
+    }
+  result->color.red   = color->red;
+  result->color.green = color->green;
+  result->color.blue  = color->blue;
+  result->color.alpha = color->alpha;
+  return True;
+}
+
+
+void
+XftColorFree (Display *dpy,
+              Visual *visual,
+              Colormap cmap,
+              XftColor *color)
+{
+  if (!dpy || !visual || !color) abort();
+  if (visual->class != TrueColor)
+    XFreeColors (dpy, cmap, &color->pixel, 1, 0);
+}
+
+
+XftDraw *
+XftDrawCreate (Display   *dpy,
+              Drawable  drawable,
+              Visual    *visual,
+              Colormap  colormap)
+{
+  XftDraw *dd = (XftDraw *) calloc (1, sizeof(*dd));
+  if (!dpy || !drawable || !visual) abort();
+  if (!dd) return 0;
+
+  dd->dpy = dpy;
+  dd->drawable = drawable;
+  dd->visual = visual;
+  dd->colormap = colormap;
+  dd->gc = XCreateGC (dpy, drawable, 0, 0);
+  return dd;
+}
+
+
+void
+XftDrawDestroy (XftDraw        *draw)
+{
+  if (!draw) abort();
+  XFreeGC (draw->dpy, draw->gc);
+  free (draw);
+}
+
+
+void
+XftTextExtentsUtf8 (Display        *dpy,
+                   XftFont         *font,
+                   _Xconst FcChar8 *string,
+                   int             len,
+                   XGlyphInfo      *extents)
+{
+  int direction, ascent, descent;
+  XCharStruct overall;
+  XChar2b *s16;
+  int s16_len = 0;
+  char *s2 = (char *) malloc (len + 1);
+
+  if (!dpy || !font || !string || !extents || !s2) abort();
+
+  strncpy (s2, (char *) string, len);
+  s2[len] = 0;
+  s16 = utf8_to_XChar2b (s2, &s16_len);
+  free (s2);
+  XTextExtents16 (font->xfont, s16, s16_len,
+                  &direction, &ascent, &descent, &overall);
+  free (s16);
+
+  extents->x      = -overall.lbearing;
+  extents->y      =  overall.ascent;
+  extents->xOff   =  overall.width;
+  extents->yOff   =  0;
+  extents->width  =  overall.rbearing - overall.lbearing;
+  extents->height =  overall.ascent + overall.descent;
+}
+
+
+void
+XftDrawStringUtf8 (XftDraw         *draw,
+                  _Xconst XftColor *color,
+                  XftFont          *font,
+                  int              x,
+                  int              y,
+                  _Xconst FcChar8  *string,
+                  int              len)
+{
+  if (!draw || !color || !font || !string) abort();
+
+  if (color->pixel != draw->pixel)
+    {
+      XSetForeground (draw->dpy, draw->gc, color->pixel);
+      draw->pixel = color->pixel;
+    }
+  if (font->xfont->fid != draw->fid)
+    {
+      XSetFont (draw->dpy, draw->gc, font->xfont->fid);
+      draw->fid = font->xfont->fid;
+    }
+
+# ifdef HAVE_XUTF8DRAWSTRING
+  /* If we have Xutf8DrawString, use it instead of XDrawString16 because
+     there is some chance it will handle characters of more than 16 bits
+     (beyond the Basic Multilingual Plane).
+   */
+
+  /* #### I guess I don't really understand how FontSet works, because this
+          seems to just truncate the text at the first non-ASCII character.
+          The XDrawString16() path works, however.
+   */
+  Xutf8DrawString (draw->dpy, draw->drawable, font->fontset, draw->gc, x, y, 
+                   (const char *) string, len);
+# else
+  {
+    int s16_len = 0;
+    char *s2 = (char *) malloc (len + 1);
+    XChar2b *s16;
+    strncpy (s2, (char *) string, len);
+    s2[len] = 0;
+    s16 = utf8_to_XChar2b (s2, &s16_len);
+    free (s2);
+    XDrawString16 (draw->dpy, draw->drawable, draw->gc, x, y, s16, s16_len);
+    free (s16);
+  }
+# endif
+}
+
+#else  /* HAVE_XFT */
+
+const int Wempty_translation_unit_is_a_dumb_warning = 0;
+
+#endif /* HAVE_XFT */
diff --git a/utils/xft.h b/utils/xft.h
new file mode 100644 (file)
index 0000000..e09c7b3
--- /dev/null
@@ -0,0 +1,145 @@
+/* xscreensaver, Copyright (c) 2014 Jamie Zawinski <jwz@jwz.org>
+ *
+ * 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.
+ */
+
+/* Compatibility layer using XDrawString, XDrawString16() or Xutf8DrawString().
+   This layer is used by X11 systems without Xft, and by MacOS / iOS.
+ */
+
+#ifndef __XSCREENSAVER_XFT_H__
+#define __XSCREENSAVER_XFT_H__
+
+# ifdef HAVE_XFT
+
+#  include <X11/Xft/Xft.h>
+
+# else  /* !HAVE_XFT -- whole file */
+
+# ifdef HAVE_COCOA
+#  include "jwxyz.h"
+#elif defined(HAVE_ANDROID)
+#  include "jwxyz.h"
+# else
+#  include <X11/Xlib.h>
+# endif
+
+/* This doesn't seem to work right.  See comment in xft.c. */
+# undef HAVE_XUTF8DRAWSTRING
+
+
+# ifndef _Xconst
+#  define _Xconst const
+# endif
+
+typedef struct _XGlyphInfo {
+  unsigned short width, height;     /* bounding box of the ink */
+  short x, y;          /* distance from upper left of bbox to glyph origin. */
+  short xOff, yOff;    /* distance from glyph origin to next origin. */
+
+  /* These field names and values are, of course, arbitrarily different
+     from XCharStruct for no sensible reason.  Here's a translation key
+     between the two:
+
+     XGlyphInfo from XCharStruct:
+
+       g.x         =  -c.lbearing;
+       g.y         =   c.ascent;
+       g.xOff      =   c.width;
+       g.yOff      =   0;
+       g.width     =   c.rbearing - c.lbearing;
+       g.height    =   c.ascent   + c.descent;
+     
+     XCharStruct from XGlyphInfo:
+
+       c.lbearing  =  -g.x;
+       c.rbearing  =   g.width - g.x;
+       c.ascent    =   g.y;
+       c.descent   =   g.height - g.y;
+       c.width     =   g.xOff;
+   */
+
+} XGlyphInfo;
+
+
+typedef struct _XftFont {
+  XFontStruct *xfont;
+# ifdef HAVE_XUTF8DRAWSTRING
+  XFontSet fontset;
+# endif
+  char *name;
+  int ascent;
+  int descent;
+  int height;
+} XftFont;
+
+typedef struct {
+  unsigned short   red;
+  unsigned short   green;
+  unsigned short   blue;
+  unsigned short   alpha;
+} XRenderColor;
+
+typedef struct _XftColor {
+  unsigned long pixel;
+  XRenderColor color;
+} XftColor;
+
+typedef struct _XftDraw XftDraw;
+
+typedef unsigned char FcChar8;
+
+
+XftFont *XftFontOpenXlfd (Display *dpy, int screen, _Xconst char *xlfd);
+
+void XftFontClose (Display *dpy, XftFont *font);
+
+Bool XftColorAllocName (Display  *dpy,
+                        _Xconst Visual *visual,
+                        Colormap cmap,
+                        _Xconst char *name,
+                        XftColor *result);
+
+Bool XftColorAllocValue (Display *dpy,
+                         _Xconst Visual *visual,
+                         Colormap cmap,
+                         _Xconst XRenderColor *color,
+                         XftColor *result);
+
+void XftColorFree (Display *dpy,
+                   Visual *visual,
+                   Colormap cmap,
+                   XftColor *color);
+
+XftDraw *XftDrawCreate (Display   *dpy,
+                        Drawable  drawable,
+                        Visual    *visual,
+                        Colormap  colormap);
+
+void XftDrawDestroy (XftDraw *draw);
+
+void
+XftTextExtentsUtf8 (Display        *dpy,
+                   XftFont         *pub,
+                   _Xconst FcChar8 *string,
+                   int             len,
+                   XGlyphInfo      *extents);
+
+void
+XftDrawStringUtf8 (XftDraw         *draw,
+                  _Xconst XftColor *color,
+                  XftFont          *pub,
+                  int              x,
+                  int              y,
+                  _Xconst FcChar8  *string,
+                  int              len);
+
+# endif /* !HAVE_XFT */
+
+#endif /* __XSCREENSAVER_XFT_H__ */
index b79b6f3eead8b445552d5e09082b818ec23d193e..4ce7ce1c8ee8cc0a84e7872aba2060a2ed99ac28 100644 (file)
@@ -1,5 +1,5 @@
 %define        name xscreensaver
-%define        version 5.30
+%define        version 5.31
 
 Summary:       X screen saver and locker
 Name:          %{name}
index b1af34a93dbfd3ec711137382487ac3426302d55..ac7290ae424a653dd877f33ef80613a17e1513fe 100644 (file)
@@ -52,6 +52,7 @@
                                AF77798909B6604C00EA3033 /* PBXTargetDependency */,
                                AF77798709B6604B00EA3033 /* PBXTargetDependency */,
                                AF77798509B6604B00EA3033 /* PBXTargetDependency */,
+                               AF73FF3F1A0988F000E485E9 /* PBXTargetDependency */,
                                AF77798309B6604B00EA3033 /* PBXTargetDependency */,
                                AF77798109B6604B00EA3033 /* PBXTargetDependency */,
                                AF77797F09B6604B00EA3033 /* PBXTargetDependency */,
                        buildPhases = (
                        );
                        dependencies = (
-                               AF39E2BA198A16920064A58D /* PBXTargetDependency */,
-                               AFF3CA0117CCAE210028F240 /* PBXTargetDependency */,
                                AF777A6509B660B700EA3033 /* PBXTargetDependency */,
                                AF777A6309B660B700EA3033 /* PBXTargetDependency */,
                                AF777A6109B660B700EA3033 /* PBXTargetDependency */,
                                AF777A4F09B660B600EA3033 /* PBXTargetDependency */,
                                AF777A4D09B660B600EA3033 /* PBXTargetDependency */,
                                AF777A4B09B660B600EA3033 /* PBXTargetDependency */,
+                               AF5C9B161A0CCF8000B0147A /* PBXTargetDependency */,
                                AF4F10EE143450C300E34F3F /* PBXTargetDependency */,
                                AF777A4909B660B500EA3033 /* PBXTargetDependency */,
                                AF777A4709B660B500EA3033 /* PBXTargetDependency */,
                                AF777A3309B660B400EA3033 /* PBXTargetDependency */,
                                AF777A3109B660B400EA3033 /* PBXTargetDependency */,
                                AF777A2F09B660B400EA3033 /* PBXTargetDependency */,
+                               AFF3CA0117CCAE210028F240 /* PBXTargetDependency */,
+                               AF7ACFDC19FF0BDB00BD752B /* PBXTargetDependency */,
                                AF777A2D09B660B400EA3033 /* PBXTargetDependency */,
                                AF777A2B09B660B400EA3033 /* PBXTargetDependency */,
                                AF777A2909B660B400EA3033 /* PBXTargetDependency */,
                                AF4F10F2143450C300E34F3F /* PBXTargetDependency */,
                                AFDA65AA178A54690070D24B /* PBXTargetDependency */,
                                AF0DCA5C0C4CBB4300D76972 /* PBXTargetDependency */,
+                               AF39E2BA198A16920064A58D /* PBXTargetDependency */,
                        );
                        name = "All Savers (OpenGL)";
                        productName = "All Savers (OpenGL)";
                        name = "All Savers";
                        productName = "All Savers";
                };
-               AFA33C020B058E17002B0E7D /* webcollage */ = {
+               AFA33C020B058E17002B0E7D /* webcollage-perl */ = {
                        isa = PBXAggregateTarget;
-                       buildConfigurationList = AFA33C070B058E67002B0E7D /* Build configuration list for PBXAggregateTarget "webcollage" */;
+                       buildConfigurationList = AFA33C070B058E67002B0E7D /* Build configuration list for PBXAggregateTarget "webcollage-perl" */;
                        buildPhases = (
                        );
                        dependencies = (
                        );
-                       name = webcollage;
+                       name = "webcollage-perl";
                        productName = webcollage;
                };
 /* End PBXAggregateTarget section */
                AF1ADA141850132600932759 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };
                AF1ADA161850157400932759 /* Updater.xib in Resources */ = {isa = PBXBuildFile; fileRef = AF1ADA151850157400932759 /* Updater.xib */; };
                AF1ADA181850180E00932759 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF1ADA171850180E00932759 /* Sparkle.framework */; };
-               AF1ADA1A1850186B00932759 /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = AF1ADA171850180E00932759 /* Sparkle.framework */; };
+               AF1ADA1A1850186B00932759 /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = AF1ADA171850180E00932759 /* Sparkle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
                AF1ADA1B18501B3D00932759 /* SaverRunner.icns in Resources */ = {isa = PBXBuildFile; fileRef = AF2D522513E954A0002AA818 /* SaverRunner.icns */; };
                AF1ADA1F18504A4F00932759 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
                AF1FD713158FF96500C40F17 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
                AF51FD431584600300E5741F /* iSaverRunner114.png in Resources */ = {isa = PBXBuildFile; fileRef = AF01295E157D5C2C00C396E1 /* iSaverRunner114.png */; };
                AF561DF615969BC3007CA5ED /* iosgrabimage.m in Sources */ = {isa = PBXBuildFile; fileRef = AF561DF515969BC3007CA5ED /* iosgrabimage.m */; };
                AF561DF815969C5B007CA5ED /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF561DF715969C5B007CA5ED /* AssetsLibrary.framework */; };
+               AF5C9AFD1A0CCE6E00B0147A /* dangerball.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258920988A468000655EE /* dangerball.xml */; };
+               AF5C9AFF1A0CCE6E00B0147A /* dangerball.c in Sources */ = {isa = PBXBuildFile; fileRef = AF480DD1098F4F6200FB32B8 /* dangerball.c */; };
+               AF5C9B001A0CCE6E00B0147A /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+               AF5C9B021A0CCE6E00B0147A /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+               AF5C9B031A0CCE6E00B0147A /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+               AF5C9B041A0CCE6E00B0147A /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+               AF5C9B051A0CCE6E00B0147A /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+               AF5C9B061A0CCE6E00B0147A /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+               AF5C9B071A0CCE6E00B0147A /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+               AF5C9B111A0CCF4E00B0147A /* cityflow.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF5C9B0F1A0CCF4E00B0147A /* cityflow.xml */; };
+               AF5C9B121A0CCF4E00B0147A /* cityflow.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF5C9B0F1A0CCF4E00B0147A /* cityflow.xml */; };
+               AF5C9B131A0CCF4E00B0147A /* cityflow.c in Sources */ = {isa = PBXBuildFile; fileRef = AF5C9B101A0CCF4E00B0147A /* cityflow.c */; };
+               AF5C9B141A0CCF4E00B0147A /* cityflow.c in Sources */ = {isa = PBXBuildFile; fileRef = AF5C9B101A0CCF4E00B0147A /* cityflow.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
                AF6048FB157C07C600CA21E4 /* jwzgles.c in Sources */ = {isa = PBXBuildFile; fileRef = AF6048F8157C07C600CA21E4 /* jwzgles.c */; };
                AF6048FC157C07C600CA21E4 /* jwzgles.h in Headers */ = {isa = PBXBuildFile; fileRef = AF6048F9157C07C600CA21E4 /* jwzgles.h */; };
                AF6048FD157C07C600CA21E4 /* jwzglesI.h in Headers */ = {isa = PBXBuildFile; fileRef = AF6048FA157C07C600CA21E4 /* jwzglesI.h */; };
                AF72284818D943DF000D36EC /* iSaverRunner76.png in Resources */ = {isa = PBXBuildFile; fileRef = AF72284518D943DF000D36EC /* iSaverRunner76.png */; };
                AF72284918D943DF000D36EC /* iSaverRunner120.png in Resources */ = {isa = PBXBuildFile; fileRef = AF72284618D943DF000D36EC /* iSaverRunner120.png */; };
                AF72284A18D943DF000D36EC /* iSaverRunner152.png in Resources */ = {isa = PBXBuildFile; fileRef = AF72284718D943DF000D36EC /* iSaverRunner152.png */; };
+               AF73FF211A08AB9400E485E9 /* iSaverRunner57t.png in Resources */ = {isa = PBXBuildFile; fileRef = AF73FF201A08AB9400E485E9 /* iSaverRunner57t.png */; };
+               AF73FF291A09877F00E485E9 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+               AF73FF2B1A09877F00E485E9 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+               AF73FF2C1A09877F00E485E9 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+               AF73FF2D1A09877F00E485E9 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+               AF73FF2E1A09877F00E485E9 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+               AF73FF2F1A09877F00E485E9 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+               AF73FF301A09877F00E485E9 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+               AF73FF391A09889700E485E9 /* binaryring.c in Sources */ = {isa = PBXBuildFile; fileRef = AF73FF381A09889700E485E9 /* binaryring.c */; };
+               AF73FF3A1A09889700E485E9 /* binaryring.c in Sources */ = {isa = PBXBuildFile; fileRef = AF73FF381A09889700E485E9 /* binaryring.c */; };
+               AF73FF3C1A0988C500E485E9 /* binaryring.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF73FF3B1A0988C500E485E9 /* binaryring.xml */; };
+               AF73FF3D1A0988C500E485E9 /* binaryring.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF73FF3B1A0988C500E485E9 /* binaryring.xml */; };
                AF7511051782B5B900380EA1 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
                AF7511081782B5B900380EA1 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
                AF7511091782B5B900380EA1 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
                AF7778AB09B659C800EA3033 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
                AF7778B909B65A6E00EA3033 /* blitspin.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258760988A468000655EE /* blitspin.xml */; };
                AF7778BB09B65A8A00EA3033 /* blitspin.c in Sources */ = {isa = PBXBuildFile; fileRef = AF7778BA09B65A8A00EA3033 /* blitspin.c */; };
-               AF7778C409B65CFE00EA3033 /* font-ximage.c in Sources */ = {isa = PBXBuildFile; fileRef = AF7778C209B65CFE00EA3033 /* font-ximage.c */; };
-               AF7778C509B65CFE00EA3033 /* font-ximage.c in Sources */ = {isa = PBXBuildFile; fileRef = AF7778C209B65CFE00EA3033 /* font-ximage.c */; };
-               AF7778C609B65CFE00EA3033 /* font-ximage.c in Sources */ = {isa = PBXBuildFile; fileRef = AF7778C209B65CFE00EA3033 /* font-ximage.c */; };
-               AF7778C709B65CFE00EA3033 /* font-ximage.h in Headers */ = {isa = PBXBuildFile; fileRef = AF7778C309B65CFE00EA3033 /* font-ximage.h */; };
                AF78369717DB9F25003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
                AF78369817DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
                AF78369917DBA580003B9FC0 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
                AF794FD309974FA60059A8B0 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
                AF794FDF09974FD10059A8B0 /* loop.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258DD0988A468000655EE /* loop.xml */; };
                AF794FE109974FEC0059A8B0 /* loop.c in Sources */ = {isa = PBXBuildFile; fileRef = AF794FE009974FEC0059A8B0 /* loop.c */; };
-               AF7E080415932A1600D81407 /* iSaverRunner29t.png in Resources */ = {isa = PBXBuildFile; fileRef = AF7E080315932A1600D81407 /* iSaverRunner29t.png */; };
+               AF7ACFC719FF0A9200BD752B /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
+               AF7ACFC919FF0A9200BD752B /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; };
+               AF7ACFCA19FF0A9200BD752B /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
+               AF7ACFCB19FF0A9200BD752B /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; };
+               AF7ACFCC19FF0A9200BD752B /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+               AF7ACFCD19FF0A9200BD752B /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; };
+               AF7ACFCE19FF0A9200BD752B /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; };
+               AF7ACFD719FF0B7A00BD752B /* geodesicgears.c in Sources */ = {isa = PBXBuildFile; fileRef = AF7ACFD619FF0B7A00BD752B /* geodesicgears.c */; };
+               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 */; };
                AF7F54A517DC24A300CE1158 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78377C17DBA85D003B9FC0 /* libz.dylib */; };
                AF7F54A617DC24B500CE1158 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78377C17DBA85D003B9FC0 /* libz.dylib */; };
                AF918A55158FC3E5002B5D1E /* flipscreen3d.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77775409B644FF00EA3033 /* flipscreen3d.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
                AF918A56158FC3E5002B5D1E /* fliptext.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77780109B64EC000EA3033 /* fliptext.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
                AF918A57158FC3E5002B5D1E /* flyingtoasters.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55E980993608800F3E977 /* flyingtoasters.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
-               AF918A58158FC3E5002B5D1E /* font-ximage.c in Sources */ = {isa = PBXBuildFile; fileRef = AF7778C209B65CFE00EA3033 /* font-ximage.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
                AF918A59158FC3E5002B5D1E /* fps-gl.c in Sources */ = {isa = PBXBuildFile; fileRef = AFBF89AE0E423FC3006A2D66 /* fps-gl.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
                AF918A5A158FC3E5002B5D1E /* gears.c in Sources */ = {isa = PBXBuildFile; fileRef = AF4812250990CB8C00FB32B8 /* gears.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
                AF918A5B158FC3E5002B5D1E /* gflux.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55BA60993401A00F3E977 /* gflux.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
                AFA55BFA099342D500F3E977 /* menger.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55BF9099342D500F3E977 /* menger.c */; };
                AFA55C220993433D00F3E977 /* engine.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2589C0988A468000655EE /* engine.xml */; };
                AFA55C240993435300F3E977 /* engine.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55C230993435300F3E977 /* engine.c */; };
-               AFA55C570993482800F3E977 /* glxfonts.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55C560993482800F3E977 /* glxfonts.c */; };
                AFA55C8B099349CC00F3E977 /* glsnake.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258BC0988A468000655EE /* glsnake.xml */; };
                AFA55C8D099349EE00F3E977 /* glsnake.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55C8C099349EE00F3E977 /* glsnake.c */; };
                AFA55CBD09934BDD00F3E977 /* boxed.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC2587B0988A468000655EE /* boxed.xml */; };
                AFA5638F0993980D00F3E977 /* timetunnel.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA5638E0993980D00F3E977 /* timetunnel.c */; };
                AFA563B8099398F700F3E977 /* juggler3d.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258D10988A468000655EE /* juggler3d.xml */; };
                AFA563BA0993991300F3E977 /* juggler3d.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA563B90993991300F3E977 /* juggler3d.c */; };
-               AFAA6B2B1773863000DE720C /* iSaverRunner29t.png in Resources */ = {isa = PBXBuildFile; fileRef = AF7E080315932A1600D81407 /* iSaverRunner29t.png */; };
                AFAA6B2C1773866200DE720C /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AFC6BBC1161CE07E0084EDB1 /* Default-568h@2x.png */; };
                AFAA6B2D1773870700DE720C /* apple2-main.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4E0509B5BC9D006E59CF /* apple2-main.c */; };
                AFAA6B2E1773870700DE720C /* apple2.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D4DD309B5B990006E59CF /* apple2.c */; };
                AFAA6B341773877C00DE720C /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3E1590056A003974F3 /* CoreGraphics.framework */; };
                AFAA6B351773878000DE720C /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF0FAF3B159BAC7B00BCE2F7 /* CoreText.framework */; };
                AFAA6B361773878400DE720C /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3F1590056A003974F3 /* QuartzCore.framework */; };
-               AFAA6B391773923900DE720C /* iSaverRunner29t.png in Resources */ = {isa = PBXBuildFile; fileRef = AF7E080315932A1600D81407 /* iSaverRunner29t.png */; };
                AFAA6B3A1773923D00DE720C /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AFC6BBC1161CE07E0084EDB1 /* Default-568h@2x.png */; };
                AFAA6B3B1773926C00DE720C /* phosphor.c in Sources */ = {isa = PBXBuildFile; fileRef = AF77770309B63B5F00EA3033 /* phosphor.c */; };
                AFAA6B3D177392DD00DE720C /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3A1590054B003974F3 /* OpenGLES.framework */; };
                AFDA65A6178A541A0070D24B /* unknownpleasures.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFDA65A3178A541A0070D24B /* unknownpleasures.xml */; };
                AFDA65A7178A541A0070D24B /* unknownpleasures.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDA65A4178A541A0070D24B /* unknownpleasures.c */; };
                AFDA65A8178A541A0070D24B /* unknownpleasures.c in Sources */ = {isa = PBXBuildFile; fileRef = AFDA65A4178A541A0070D24B /* unknownpleasures.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+               AFDDCCEC19FF0D170072365B /* involute.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE6A16A0CDD78EA002805BF /* involute.c */; };
+               AFDDCCED19FF0EBD0072365B /* geodesicgears.c in Sources */ = {isa = PBXBuildFile; fileRef = AF7ACFD619FF0B7A00BD752B /* geodesicgears.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
                AFE2A45C0E2E904600ADB298 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
                AFE2A4730E2E90E300ADB298 /* skytentacles.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE2A4720E2E90E300ADB298 /* skytentacles.c */; };
                AFE2A4750E2E911200ADB298 /* skytentacles.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFE2A4740E2E911200ADB298 /* skytentacles.xml */; };
                AFE6A4220CDD7FAA002805BF /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; };
                AFE6A4350CDD800F002805BF /* abstractile.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE6A4340CDD800F002805BF /* abstractile.c */; };
                AFE6A4370CDD8027002805BF /* abstractile.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFE6A4360CDD8026002805BF /* abstractile.xml */; };
+               AFE943B119DD54C1000A5E6D /* xft.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE943AF19DD54C1000A5E6D /* xft.c */; };
+               AFE943B219DD54C1000A5E6D /* xft.h in Headers */ = {isa = PBXBuildFile; fileRef = AFE943B019DD54C1000A5E6D /* xft.h */; };
+               AFE943B519DDF97F000A5E6D /* utf8wc.c in Sources */ = {isa = PBXBuildFile; fileRef = AFE943B319DDF97F000A5E6D /* utf8wc.c */; };
+               AFE943B619DDF97F000A5E6D /* utf8wc.h in Headers */ = {isa = PBXBuildFile; fileRef = AFE943B419DDF97F000A5E6D /* utf8wc.h */; };
                AFEB9C37158FFF88003974F3 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; };
                AFEB9C3915900514003974F3 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3815900514003974F3 /* UIKit.framework */; };
                AFEB9C3B1590054B003974F3 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEB9C3A1590054B003974F3 /* OpenGLES.framework */; };
                AFFAB33019158E2A0020F021 /* projectiveplane.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFFAB32C19158E2A0020F021 /* projectiveplane.xml */; };
                AFFAB33219158EA80020F021 /* projectiveplane.c in Sources */ = {isa = PBXBuildFile; fileRef = AFFAB33119158EA80020F021 /* projectiveplane.c */; };
                AFFAB33319158EA80020F021 /* projectiveplane.c in Sources */ = {isa = PBXBuildFile; fileRef = AFFAB33119158EA80020F021 /* projectiveplane.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; };
+               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 */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
                        remoteGlobalIDString = AF4FF4BA0D52CBDE00666F98;
                        remoteInfo = CubicGrid;
                };
+               AF5C9AFB1A0CCE6E00B0147A /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+                       remoteInfo = jwxyz;
+               };
+               AF5C9B151A0CCF8000B0147A /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = AF5C9AF91A0CCE6E00B0147A;
+                       remoteInfo = Cityflow;
+               };
                AF6423F4099FF9C2000F4CD4 /* PBXContainerItemProxy */ = {
                        isa = PBXContainerItemProxy;
                        containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
                        remoteGlobalIDString = AFD570C90996B9F800BA26F7;
                        remoteInfo = Ant;
                };
+               AF73FF241A09877F00E485E9 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+                       remoteInfo = jwxyz;
+               };
+               AF73FF3E1A0988F000E485E9 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = AF73FF221A09877F00E485E9;
+                       remoteInfo = BinaryRing;
+               };
                AF7511011782B5B900380EA1 /* PBXContainerItemProxy */ = {
                        isa = PBXContainerItemProxy;
                        containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
                        remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
                        remoteInfo = jwxyz;
                };
+               AF7ACFC219FF0A9200BD752B /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
+                       remoteInfo = jwxyz;
+               };
+               AF7ACFDB19FF0BDB00BD752B /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = AF7ACFC019FF0A9200BD752B;
+                       remoteInfo = GeodesicGears;
+               };
                AF7E07FD15925DF200D81407 /* PBXContainerItemProxy */ = {
                        isa = PBXContainerItemProxy;
                        containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
                        remoteGlobalIDString = AF4808C0098C3B6C00FB32B8;
                        remoteInfo = jwxyz;
                };
-               AF9E7EDE190F4F7200A8B01F /* PBXContainerItemProxy */ = {
-                       isa = PBXContainerItemProxy;
-                       containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
-                       proxyType = 1;
-                       remoteGlobalIDString = AF9E7EBE190F4C1B00A8B01F;
-                       remoteInfo = enable_gc;
-               };
                AFA160911052FF87009B93AA /* PBXContainerItemProxy */ = {
                        isa = PBXContainerItemProxy;
                        containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */;
                AF561DF3159651A7007CA5ED /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/AudioToolbox.framework; sourceTree = DEVELOPER_DIR; };
                AF561DF515969BC3007CA5ED /* iosgrabimage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = iosgrabimage.m; path = OSX/iosgrabimage.m; sourceTree = "<group>"; };
                AF561DF715969C5B007CA5ED /* AssetsLibrary.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AssetsLibrary.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/AssetsLibrary.framework; sourceTree = DEVELOPER_DIR; };
+               AF5C9B0D1A0CCE6E00B0147A /* Cityflow.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Cityflow.saver; sourceTree = BUILT_PRODUCTS_DIR; };
+               AF5C9B0F1A0CCF4E00B0147A /* cityflow.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = cityflow.xml; sourceTree = "<group>"; };
+               AF5C9B101A0CCF4E00B0147A /* cityflow.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cityflow.c; path = hacks/glx/cityflow.c; sourceTree = "<group>"; };
                AF6048F8157C07C600CA21E4 /* jwzgles.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jwzgles.c; path = hacks/glx/jwzgles.c; sourceTree = "<group>"; };
                AF6048F9157C07C600CA21E4 /* jwzgles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = jwzgles.h; path = hacks/glx/jwzgles.h; sourceTree = "<group>"; };
                AF6048FA157C07C600CA21E4 /* jwzglesI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = jwzglesI.h; path = hacks/glx/jwzglesI.h; sourceTree = "<group>"; };
                AF72284518D943DF000D36EC /* iSaverRunner76.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = iSaverRunner76.png; path = OSX/iSaverRunner76.png; sourceTree = "<group>"; };
                AF72284618D943DF000D36EC /* iSaverRunner120.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = iSaverRunner120.png; path = OSX/iSaverRunner120.png; sourceTree = "<group>"; };
                AF72284718D943DF000D36EC /* iSaverRunner152.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = iSaverRunner152.png; path = OSX/iSaverRunner152.png; sourceTree = "<group>"; };
+               AF73FF201A08AB9400E485E9 /* iSaverRunner57t.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = iSaverRunner57t.png; path = OSX/iSaverRunner57t.png; sourceTree = "<group>"; };
+               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 = "<group>"; };
+               AF73FF3B1A0988C500E485E9 /* binaryring.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = binaryring.xml; sourceTree = "<group>"; };
                AF7511121782B5B900380EA1 /* Kaleidocycle.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Kaleidocycle.saver; sourceTree = BUILT_PRODUCTS_DIR; };
                AF7511141782B64300380EA1 /* kaleidocycle.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = kaleidocycle.c; path = hacks/glx/kaleidocycle.c; sourceTree = "<group>"; };
                AF7511161782B66400380EA1 /* kaleidescope.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = kaleidescope.xml; sourceTree = "<group>"; };
                AF7778BE09B65BA300EA3033 /* molecules.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; name = molecules.sh; path = hacks/glx/molecules.sh; sourceTree = "<group>"; };
                AF7778C009B65C0F00EA3033 /* sproingies.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = sproingies.h; path = hacks/glx/sproingies.h; sourceTree = "<group>"; };
                AF7778C109B65C6A00EA3033 /* e_textures.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = e_textures.h; path = hacks/glx/e_textures.h; sourceTree = "<group>"; };
-               AF7778C209B65CFE00EA3033 /* font-ximage.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = "font-ximage.c"; path = "hacks/glx/font-ximage.c"; sourceTree = "<group>"; };
-               AF7778C309B65CFE00EA3033 /* font-ximage.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = "font-ximage.h"; path = "hacks/glx/font-ximage.h"; sourceTree = "<group>"; };
                AF78369617DB9F25003B9FC0 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };
                AF78377C17DBA85D003B9FC0 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/lib/libz.dylib; sourceTree = DEVELOPER_DIR; };
                AF78D189142DD8F3002AAF77 /* Hilbert.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Hilbert.saver; sourceTree = BUILT_PRODUCTS_DIR; };
                AF795014099751940059A8B0 /* pacman_level.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = pacman_level.h; path = hacks/pacman_level.h; sourceTree = "<group>"; };
                AF795015099751940059A8B0 /* pacman.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = pacman.c; path = hacks/pacman.c; sourceTree = "<group>"; };
                AF795016099751940059A8B0 /* pacman.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = pacman.h; path = hacks/pacman.h; sourceTree = "<group>"; };
-               AF7E080315932A1600D81407 /* iSaverRunner29t.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = iSaverRunner29t.png; path = OSX/iSaverRunner29t.png; sourceTree = "<group>"; };
+               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 = "<group>"; };
+               AF7ACFD819FF0BA600BD752B /* geodesicgears.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = geodesicgears.xml; sourceTree = "<group>"; };
                AF84AF1E15829AF000607E4C /* SaverListController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SaverListController.m; path = OSX/SaverListController.m; sourceTree = "<group>"; };
                AF84FD4109B1209E00F3AB06 /* GLUT.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLUT.framework; path = /System/Library/Frameworks/GLUT.framework; sourceTree = "<absolute>"; };
                AF91898F158FC00A002B5D1E /* XScreenSaver.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = XScreenSaver.app; sourceTree = BUILT_PRODUCTS_DIR; };
+               AF94E7411A16E93600289B93 /* xscreensaver.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = xscreensaver.xcconfig; path = OSX/xscreensaver.xcconfig; sourceTree = "<group>"; };
                AF97573D099C317000B05160 /* IMSMap.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = IMSMap.saver; sourceTree = BUILT_PRODUCTS_DIR; };
                AF975740099C31DD00B05160 /* imsmap.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = imsmap.c; path = hacks/imsmap.c; sourceTree = "<group>"; };
                AF975785099C374A00B05160 /* Moire.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Moire.saver; sourceTree = BUILT_PRODUCTS_DIR; };
                AFA55BF9099342D500F3E977 /* menger.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = menger.c; path = hacks/glx/menger.c; sourceTree = "<group>"; };
                AFA55C200993431300F3E977 /* Engine.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Engine.saver; sourceTree = BUILT_PRODUCTS_DIR; };
                AFA55C230993435300F3E977 /* engine.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = engine.c; path = hacks/glx/engine.c; sourceTree = "<group>"; };
-               AFA55C560993482800F3E977 /* glxfonts.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = glxfonts.c; path = hacks/glx/glxfonts.c; sourceTree = "<group>"; };
                AFA55C89099349A600F3E977 /* GLSnake.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GLSnake.saver; sourceTree = BUILT_PRODUCTS_DIR; };
                AFA55C8C099349EE00F3E977 /* glsnake.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = glsnake.c; path = hacks/glx/glsnake.c; sourceTree = "<group>"; };
                AFA55CBB09934BB200F3E977 /* Boxed.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Boxed.saver; sourceTree = BUILT_PRODUCTS_DIR; };
                AFA561B209937DCB00F3E977 /* polyhedra-gl.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = "polyhedra-gl.c"; path = "hacks/glx/polyhedra-gl.c"; sourceTree = "<group>"; };
                AFA561B309937DCC00F3E977 /* polyhedra.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = polyhedra.c; path = hacks/glx/polyhedra.c; sourceTree = "<group>"; };
                AFA561B409937DCC00F3E977 /* polyhedra.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = polyhedra.h; path = hacks/glx/polyhedra.h; sourceTree = "<group>"; };
-               AFA561BA09937E9E00F3E977 /* glxfonts.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = glxfonts.h; path = hacks/glx/glxfonts.h; sourceTree = "<group>"; };
                AFA562190993849F00F3E977 /* Providence.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Providence.saver; sourceTree = BUILT_PRODUCTS_DIR; };
                AFA5621C099384F600F3E977 /* providence.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = providence.c; path = hacks/glx/providence.c; sourceTree = "<group>"; };
                AFA562310993852500F3E977 /* Pinion.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Pinion.saver; sourceTree = BUILT_PRODUCTS_DIR; };
                AFE6A42D0CDD7FAA002805BF /* Abstractile.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Abstractile.saver; sourceTree = BUILT_PRODUCTS_DIR; };
                AFE6A4340CDD800F002805BF /* abstractile.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = abstractile.c; path = hacks/abstractile.c; sourceTree = "<group>"; };
                AFE6A4360CDD8026002805BF /* abstractile.xml */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.xml; path = abstractile.xml; sourceTree = "<group>"; };
+               AFE943AF19DD54C1000A5E6D /* xft.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xft.c; path = utils/xft.c; sourceTree = "<group>"; };
+               AFE943B019DD54C1000A5E6D /* xft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = xft.h; path = utils/xft.h; sourceTree = "<group>"; };
+               AFE943B319DDF97F000A5E6D /* utf8wc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = utf8wc.c; path = utils/utf8wc.c; sourceTree = "<group>"; };
+               AFE943B419DDF97F000A5E6D /* utf8wc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utf8wc.h; path = utils/utf8wc.h; sourceTree = "<group>"; };
                AFEB9C3815900514003974F3 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
                AFEB9C3A1590054B003974F3 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/Frameworks/OpenGLES.framework; sourceTree = DEVELOPER_DIR; };
                AFEB9C3C15900558003974F3 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
                AFFAB32919158CE40020F021 /* ProjectivePlane.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ProjectivePlane.saver; sourceTree = BUILT_PRODUCTS_DIR; };
                AFFAB32C19158E2A0020F021 /* projectiveplane.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = projectiveplane.xml; sourceTree = "<group>"; };
                AFFAB33119158EA80020F021 /* projectiveplane.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = projectiveplane.c; path = hacks/glx/projectiveplane.c; sourceTree = "<group>"; };
+               CE9289D119BD00E200961F22 /* async_netdb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = async_netdb.c; path = utils/async_netdb.c; sourceTree = "<group>"; };
+               CE9289D219BD00E300961F22 /* async_netdb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = async_netdb.h; path = utils/async_netdb.h; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AF5C9B011A0CCE6E00B0147A /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AF5C9B021A0CCE6E00B0147A /* libjwxyz.a in Frameworks */,
+                               AF5C9B031A0CCE6E00B0147A /* ScreenSaver.framework in Frameworks */,
+                               AF5C9B041A0CCE6E00B0147A /* QuartzCore.framework in Frameworks */,
+                               AF5C9B051A0CCE6E00B0147A /* Cocoa.framework in Frameworks */,
+                               AF5C9B061A0CCE6E00B0147A /* Carbon.framework in Frameworks */,
+                               AF5C9B071A0CCE6E00B0147A /* libz.dylib in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AF6423FA099FF9C2000F4CD4 /* Frameworks */ = {
                        isa = PBXFrameworksBuildPhase;
                        buildActionMask = 2147483647;
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AF73FF2A1A09877F00E485E9 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AF73FF2B1A09877F00E485E9 /* libjwxyz.a in Frameworks */,
+                               AF73FF2C1A09877F00E485E9 /* ScreenSaver.framework in Frameworks */,
+                               AF73FF2D1A09877F00E485E9 /* QuartzCore.framework in Frameworks */,
+                               AF73FF2E1A09877F00E485E9 /* Cocoa.framework in Frameworks */,
+                               AF73FF2F1A09877F00E485E9 /* Carbon.framework in Frameworks */,
+                               AF73FF301A09877F00E485E9 /* libz.dylib in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AF7511071782B5B900380EA1 /* Frameworks */ = {
                        isa = PBXFrameworksBuildPhase;
                        buildActionMask = 2147483647;
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AF7ACFC819FF0A9200BD752B /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AF7ACFC919FF0A9200BD752B /* libjwxyz.a in Frameworks */,
+                               AF7ACFCA19FF0A9200BD752B /* ScreenSaver.framework in Frameworks */,
+                               AF7ACFCB19FF0A9200BD752B /* QuartzCore.framework in Frameworks */,
+                               AF7ACFCC19FF0A9200BD752B /* Cocoa.framework in Frameworks */,
+                               AF7ACFCD19FF0A9200BD752B /* Carbon.framework in Frameworks */,
+                               AF7ACFCE19FF0A9200BD752B /* libz.dylib in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AF918989158FC00A002B5D1E /* Frameworks */ = {
                        isa = PBXFrameworksBuildPhase;
                        buildActionMask = 2147483647;
                                AFFAB32919158CE40020F021 /* ProjectivePlane.saver */,
                                AF68A49219196CF800D41CD1 /* Tessellimage.saver */,
                                AF39E296198A11F60064A58D /* WindupRobot.saver */,
+                               AF7ACFD419FF0A9200BD752B /* GeodesicGears.saver */,
+                               AF73FF361A09877F00E485E9 /* BinaryRing.saver */,
+                               AF5C9B0D1A0CCE6E00B0147A /* Cityflow.saver */,
                        );
                        name = Products;
                        sourceTree = "<group>";
                                AF56019B157DAA3D00DB2055 /* iSaverRunner.xib */,
                                AF2D522513E954A0002AA818 /* SaverRunner.icns */,
                                AF01295A157D5C2C00C396E1 /* iSaverRunner29.png */,
-                               AF7E080315932A1600D81407 /* iSaverRunner29t.png */,
                                AF01295B157D5C2C00C396E1 /* iSaverRunner50.png */,
                                AF01295C157D5C2C00C396E1 /* iSaverRunner57.png */,
+                               AF73FF201A08AB9400E485E9 /* iSaverRunner57t.png */,
                                AF01295D157D5C2C00C396E1 /* iSaverRunner72.png */,
                                AF72284518D943DF000D36EC /* iSaverRunner76.png */,
                                AF01295E157D5C2C00C396E1 /* iSaverRunner114.png */,
                                AFC6BBC1161CE07E0084EDB1 /* Default-568h@2x.png */,
                                AF9771D90989DC4A001F8B92 /* SaverRunner.plist */,
                                AF01294C157D31DD00C396E1 /* iSaverRunner.plist */,
+                               AF94E7411A16E93600289B93 /* xscreensaver.xcconfig */,
                                8D1107310486CEB800E47090 /* XScreenSaver.plist */,
                                AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */,
                                AF0FAF0B09CA6FF900EE1051 /* xscreensaver-text */,
                                AF0DCA330C4C74A200D76972 /* asm6502.h */,
                                AF976DFA09896BEB001F8B92 /* attraction.c */,
                                AF975A99099C6C3500B05160 /* barcode.c */,
+                               AF73FF381A09889700E485E9 /* binaryring.c */,
                                AF4776A2099DAADE001F091E /* blaster.c */,
                                AF7778BA09B65A8A00EA3033 /* blitspin.c */,
                                AF4778A3099DDA91001F091E /* boxfit.c */,
                                AFA55E2309935F2B00F3E977 /* chessmodels.c */,
                                AFA55E2409935F2B00F3E977 /* chessmodels.h */,
                                AFA55BC00993416E00F3E977 /* circuit.c */,
+                               AF5C9B101A0CCF4E00B0147A /* cityflow.c */,
                                AF3581D91431D5FC00E09C51 /* companion.c */,
                                AF3581D61431D5FC00E09C51 /* companion_disc.c */,
                                AF3581D71431D5FC00E09C51 /* companion_heart.c */,
                                AF77775409B644FF00EA3033 /* flipscreen3d.c */,
                                AF77780109B64EC000EA3033 /* fliptext.c */,
                                AFA55E980993608800F3E977 /* flyingtoasters.c */,
-                               AF7778C209B65CFE00EA3033 /* font-ximage.c */,
-                               AF7778C309B65CFE00EA3033 /* font-ximage.h */,
                                AFBF89AE0E423FC3006A2D66 /* fps-gl.c */,
                                AF4812250990CB8C00FB32B8 /* gears.c */,
                                AFF3CA0217CCAEB70028F240 /* geodesic.c */,
+                               AF7ACFD619FF0B7A00BD752B /* geodesicgears.c */,
                                AFA55BA60993401A00F3E977 /* gflux.c */,
                                AFA55E4509935FD300F3E977 /* glblur.c */,
                                AFF463710C440B9200EE6509 /* glcells.c */,
                                AFC258710988A468000655EE /* attraction.xml */,
                                AFC258720988A468000655EE /* atunnel.xml */,
                                AFC258730988A468000655EE /* barcode.xml */,
+                               AF73FF3B1A0988C500E485E9 /* binaryring.xml */,
                                AFC258740988A468000655EE /* blaster.xml */,
                                AFC258750988A468000655EE /* blinkbox.xml */,
                                AFC258760988A468000655EE /* blitspin.xml */,
                                AFC258840988A468000655EE /* ccurve.xml */,
                                AFC258850988A468000655EE /* celtic.xml */,
                                AFC258860988A468000655EE /* circuit.xml */,
+                               AF5C9B0F1A0CCF4E00B0147A /* cityflow.xml */,
                                AFC258870988A468000655EE /* cloudlife.xml */,
                                AF3581E61431D61D00E09C51 /* companioncube.xml */,
                                AFC258880988A468000655EE /* compass.xml */,
                                AFC258B10988A468000655EE /* galaxy.xml */,
                                AFC258B20988A468000655EE /* gears.xml */,
                                AFF3C9FD17CCAD9A0028F240 /* geodesic.xml */,
+                               AF7ACFD819FF0BA600BD752B /* geodesicgears.xml */,
                                AFC258B30988A468000655EE /* gflux.xml */,
                                AFC258B40988A468000655EE /* glblur.xml */,
                                AFF463730C440BAC00EE6509 /* glcells.xml */,
                        children = (
                                AFDA11211934424D003D397F /* aligned_malloc.c */,
                                AFDA11221934424D003D397F /* aligned_malloc.h */,
+                               CE9289D119BD00E200961F22 /* async_netdb.c */,
+                               CE9289D219BD00E300961F22 /* async_netdb.h */,
                                AF9D473609B52EE0006E59CF /* colorbars.c */,
                                AF9D473709B52EE0006E59CF /* colorbars.h */,
                                AFC25B990988BC08000655EE /* colors.c */,
                                AFD56E0B0996A0ED00BA26F7 /* glut_stroke.c */,
                                AFD56E0C0996A0ED00BA26F7 /* glut_swidth.c */,
                                AFD56E0D0996A0ED00BA26F7 /* glutstroke.h */,
-                               AFA55C560993482800F3E977 /* glxfonts.c */,
-                               AFA561BA09937E9E00F3E977 /* glxfonts.h */,
                                AFA5607909936FDD00F3E977 /* grab-ximage.c */,
                                AFA5607A09936FDD00F3E977 /* grab-ximage.h */,
                                AFAD462209D5F4DA00AB5F95 /* grabclient.c */,
                                AF480ED1098F651C00FB32B8 /* tube.h */,
                                AFB5A0ED0981FF8B00871B16 /* usleep.c */,
                                AFB5A0EE0981FF8B00871B16 /* usleep.h */,
+                               AFE943B319DDF97F000A5E6D /* utf8wc.c */,
+                               AFE943B419DDF97F000A5E6D /* utf8wc.h */,
                                AFE1FD590981E3CB00F7970E /* utils.h */,
                                AFE1FD5A0981E3CB00F7970E /* version.h */,
                                AFA33BD00B0587EE002B0E7D /* webcollage-helper-cocoa.m */,
+                               AFE943AF19DD54C1000A5E6D /* xft.c */,
+                               AFE943B019DD54C1000A5E6D /* xft.h */,
                                AF480CBB098E37D600FB32B8 /* xlockmore.c */,
                                AF480C89098E346700FB32B8 /* xlockmore.h */,
                                AF480C8A098E34AB00FB32B8 /* xlockmoreI.h */,
                                AFA55867099324D800F3E977 /* minixpm.h in Headers */,
                                AFA55A540993353500F3E977 /* gllist.h in Headers */,
                                AFA55A96099336D800F3E977 /* normals.h in Headers */,
+                               AFE943B219DD54C1000A5E6D /* xft.h in Headers */,
                                AF975C94099C929800B05160 /* xpm-pixmap.h in Headers */,
                                AF4775C1099D9E79001F091E /* resources.h in Headers */,
                                AF9D473909B52EE0006E59CF /* colorbars.h in Headers */,
-                               AF7778C709B65CFE00EA3033 /* font-ximage.h in Headers */,
                                AFDA11261934424D003D397F /* aligned_malloc.h in Headers */,
                                AFDA11281934424D003D397F /* thread_util.h in Headers */,
                                AFBF893F0E41D930006A2D66 /* fps.h in Headers */,
                                AF6048FC157C07C600CA21E4 /* jwzgles.h in Headers */,
                                AF6048FD157C07C600CA21E4 /* jwzglesI.h in Headers */,
                                AFC7592E158D8E8B00C5458E /* textclient.h in Headers */,
+                               CE9289D419BD00E300961F22 /* async_netdb.h in Headers */,
+                               AFE943B619DDF97F000A5E6D /* utf8wc.h in Headers */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                        isa = PBXNativeTarget;
                        buildConfigurationList = AF4808C2098C3B8B00FB32B8 /* Build configuration list for PBXNativeTarget "jwxyz" */;
                        buildPhases = (
+                               AF4E1D1819CE7013002B6190 /* Update GC build settings */,
                                AF4808BD098C3B6C00FB32B8 /* Headers */,
                                AF4808BE098C3B6C00FB32B8 /* Sources */,
                                AF4808BF098C3B6C00FB32B8 /* Frameworks */,
                        buildRules = (
                        );
                        dependencies = (
-                               AF9E7EDF190F4F7200A8B01F /* PBXTargetDependency */,
                        );
                        name = jwxyz;
                        productName = jwxyz;
                        productReference = AF4FF4CE0D52CBDE00666F98 /* CubicGrid.saver */;
                        productType = "com.apple.product-type.bundle";
                };
+               AF5C9AF91A0CCE6E00B0147A /* Cityflow */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = AF5C9B0A1A0CCE6E00B0147A /* Build configuration list for PBXNativeTarget "Cityflow" */;
+                       buildPhases = (
+                               AF5C9AFC1A0CCE6E00B0147A /* Resources */,
+                               AF5C9AFE1A0CCE6E00B0147A /* Sources */,
+                               AF5C9B011A0CCE6E00B0147A /* Frameworks */,
+                               AF5C9B081A0CCE6E00B0147A /* Rez */,
+                               AF5C9B091A0CCE6E00B0147A /* Run Update Info Plist */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               AF5C9AFA1A0CCE6E00B0147A /* PBXTargetDependency */,
+                       );
+                       name = Cityflow;
+                       productName = DangerBall;
+                       productReference = AF5C9B0D1A0CCE6E00B0147A /* Cityflow.saver */;
+                       productType = "com.apple.product-type.bundle";
+               };
                AF6423F2099FF9C2000F4CD4 /* Extrusion */ = {
                        isa = PBXNativeTarget;
                        buildConfigurationList = AF642402099FF9C2000F4CD4 /* Build configuration list for PBXNativeTarget "Extrusion" */;
                        productReference = AF68A49219196CF800D41CD1 /* Tessellimage.saver */;
                        productType = "com.apple.product-type.bundle";
                };
+               AF73FF221A09877F00E485E9 /* BinaryRing */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = AF73FF331A09877F00E485E9 /* Build configuration list for PBXNativeTarget "BinaryRing" */;
+                       buildPhases = (
+                               AF73FF251A09877F00E485E9 /* Resources */,
+                               AF73FF271A09877F00E485E9 /* Sources */,
+                               AF73FF2A1A09877F00E485E9 /* Frameworks */,
+                               AF73FF311A09877F00E485E9 /* Rez */,
+                               AF73FF321A09877F00E485E9 /* Run Update Info Plist */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               AF73FF231A09877F00E485E9 /* PBXTargetDependency */,
+                       );
+                       name = BinaryRing;
+                       productName = Attraction;
+                       productReference = AF73FF361A09877F00E485E9 /* BinaryRing.saver */;
+                       productType = "com.apple.product-type.bundle";
+               };
                AF7510FF1782B5B900380EA1 /* Kaleidocycle */ = {
                        isa = PBXNativeTarget;
                        buildConfigurationList = AF75110F1782B5B900380EA1 /* Build configuration list for PBXNativeTarget "Kaleidocycle" */;
                        productReference = AF794FDD09974FA60059A8B0 /* Loop.saver */;
                        productType = "com.apple.product-type.bundle";
                };
+               AF7ACFC019FF0A9200BD752B /* GeodesicGears */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = AF7ACFD119FF0A9200BD752B /* Build configuration list for PBXNativeTarget "GeodesicGears" */;
+                       buildPhases = (
+                               AF7ACFC319FF0A9200BD752B /* Resources */,
+                               AF7ACFC519FF0A9200BD752B /* Sources */,
+                               AF7ACFC819FF0A9200BD752B /* Frameworks */,
+                               AF7ACFCF19FF0A9200BD752B /* Rez */,
+                               AF7ACFD019FF0A9200BD752B /* Run Update Info Plist */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               AF7ACFC119FF0A9200BD752B /* PBXTargetDependency */,
+                       );
+                       name = GeodesicGears;
+                       productName = DangerBall;
+                       productReference = AF7ACFD419FF0A9200BD752B /* GeodesicGears.saver */;
+                       productType = "com.apple.product-type.bundle";
+               };
                AF918977158FC00A002B5D1E /* XScreenSaver-iOS */ = {
                        isa = PBXNativeTarget;
                        buildConfigurationList = AF91898C158FC00A002B5D1E /* Build configuration list for PBXNativeTarget "XScreenSaver-iOS" */;
                        buildPhases = (
                                AF7E080115925EE300D81407 /* ICMP Sanity Check */,
+                               AF94E7421A16F66900289B93 /* Update Function Table */,
                                AF91897B158FC00A002B5D1E /* Resources */,
                                AF918985158FC00A002B5D1E /* Sources */,
                                AF918989158FC00A002B5D1E /* Frameworks */,
                29B97313FDCFA39411CA2CEA /* Project object */ = {
                        isa = PBXProject;
                        attributes = {
-                               LastUpgradeCheck = 0510;
+                               LastUpgradeCheck = 0610;
                                TargetAttributes = {
                                        AF918977158FC00A002B5D1E = {
                                                DevelopmentTeam = 4627ATJELP;
                                AFBFE74B178642DC00432B21 /* Apple2-OSX */,
                                AF9770660989D2F6001F8B92 /* Attraction */,
                                AF975A86099C6BC300B05160 /* Barcode */,
+                               AF73FF221A09877F00E485E9 /* BinaryRing */,
                                AF47768F099DAA6F001F091E /* Blaster */,
                                AF7778A509B659C800EA3033 /* BlitSpin */,
                                AF4777D1099DC183001F091E /* BoxFit */,
                                AF4776F1099DAE7A001F091E /* Vermiculate */,
                                AF47717F099D4803001F091E /* Wander */,
                                AFA3392E0B058505002B0E7D /* WebCollage */,
-                               AFA33C020B058E17002B0E7D /* webcollage */,
+                               AFA33C020B058E17002B0E7D /* webcollage-perl */,
                                AFA33BC60B058740002B0E7D /* webcollage-helper */,
                                AF4776DB099DADDF001F091E /* WhirlWindWarp */,
                                AF477382099D65A1001F091E /* Wormhole */,
                                AFA55946099330B000F3E977 /* Cage */,
                                AF77784409B6528100EA3033 /* Carousel */,
                                AFA55BAB099340CE00F3E977 /* Circuit */,
+                               AF5C9AF91A0CCE6E00B0147A /* Cityflow */,
                                AF3581BF1431D47B00E09C51 /* CompanionCube */,
                                AFA563130993951000F3E977 /* Crackberg */,
                                AFA56351099396C000F3E977 /* Cube21 */,
                                AFA55E4E09935FF900F3E977 /* FlyingToasters */,
                                AF4812500990CE2700FB32B8 /* Gears */,
                                AFF3C9E817CCAC440028F240 /* Geodesic */,
+                               AF7ACFC019FF0A9200BD752B /* GeodesicGears */,
                                AFA55B9109933FDA00F3E977 /* GFlux */,
                                AFA55E2F09935F8E00F3E977 /* GLBlur */,
                                AFF463580C440AEF00EE6509 /* GLCells */,
                                AF51FD3715845F9F00E5741F /* iSaverRunner.xib in Resources */,
                                AFAA6B3A1773923D00DE720C /* Default-568h@2x.png in Resources */,
                                AF51FD3B15845FD800E5741F /* iSaverRunner29.png in Resources */,
-                               AFAA6B391773923900DE720C /* iSaverRunner29t.png in Resources */,
                                AF51FD3C15845FDB00E5741F /* iSaverRunner50.png in Resources */,
                                AF51FD3F15845FF700E5741F /* iSaverRunner57.png in Resources */,
                                AF51FD4015845FF900E5741F /* iSaverRunner72.png in Resources */,
                                AF51FD3615845F9900E5741F /* iSaverRunner.xib in Resources */,
                                AFAA6B2C1773866200DE720C /* Default-568h@2x.png in Resources */,
                                AF51FD3A15845FD300E5741F /* iSaverRunner29.png in Resources */,
-                               AFAA6B2B1773863000DE720C /* iSaverRunner29t.png in Resources */,
                                AF51FD3D15845FDE00E5741F /* iSaverRunner50.png in Resources */,
                                AF51FD3E15845FE200E5741F /* iSaverRunner57.png in Resources */,
                                AF51FD4115845FFC00E5741F /* iSaverRunner72.png in Resources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AF5C9AFC1A0CCE6E00B0147A /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AF5C9B111A0CCF4E00B0147A /* cityflow.xml in Resources */,
+                               AF5C9AFD1A0CCE6E00B0147A /* dangerball.xml in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AF6423F5099FF9C2000F4CD4 /* Resources */ = {
                        isa = PBXResourcesBuildPhase;
                        buildActionMask = 2147483647;
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AF73FF251A09877F00E485E9 /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AF73FF3C1A0988C500E485E9 /* binaryring.xml in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AF7511021782B5B900380EA1 /* Resources */ = {
                        isa = PBXResourcesBuildPhase;
                        buildActionMask = 2147483647;
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AF7ACFC319FF0A9200BD752B /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AF7ACFD919FF0BA600BD752B /* geodesicgears.xml in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AF91897B158FC00A002B5D1E /* Resources */ = {
                        isa = PBXResourcesBuildPhase;
                        buildActionMask = 2147483647;
                                AF918983158FC00A002B5D1E /* iSaverRunner.xib in Resources */,
                                AFC6BBC2161CE07E0084EDB1 /* Default-568h@2x.png in Resources */,
                                AF91897E158FC00A002B5D1E /* iSaverRunner29.png in Resources */,
-                               AF7E080415932A1600D81407 /* iSaverRunner29t.png in Resources */,
                                AF91897F158FC00A002B5D1E /* iSaverRunner50.png in Resources */,
                                AF918980158FC00A002B5D1E /* iSaverRunner57.png in Resources */,
+                               AF73FF211A08AB9400E485E9 /* iSaverRunner57t.png in Resources */,
                                AF918981158FC00A002B5D1E /* iSaverRunner72.png in Resources */,
                                AF72284818D943DF000D36EC /* iSaverRunner76.png in Resources */,
                                AF918982158FC00A002B5D1E /* iSaverRunner114.png in Resources */,
                                AF918ABE158FC53D002B5D1E /* attraction.xml in Resources */,
                                AF918ABF158FC53D002B5D1E /* atunnel.xml in Resources */,
                                AF918AC0158FC53D002B5D1E /* barcode.xml in Resources */,
+                               AF73FF3D1A0988C500E485E9 /* binaryring.xml in Resources */,
                                AF918AC1158FC53D002B5D1E /* blaster.xml in Resources */,
                                AF918AC2158FC53D002B5D1E /* blinkbox.xml in Resources */,
                                AF918AC3158FC53D002B5D1E /* blitspin.xml in Resources */,
                                AF918AD1158FC53D002B5D1E /* ccurve.xml in Resources */,
                                AF918AD2158FC53D002B5D1E /* celtic.xml in Resources */,
                                AF918AD3158FC53D002B5D1E /* circuit.xml in Resources */,
+                               AF5C9B121A0CCF4E00B0147A /* cityflow.xml in Resources */,
                                AF918AD4158FC53D002B5D1E /* cloudlife.xml in Resources */,
                                AF918AD5158FC53D002B5D1E /* companioncube.xml in Resources */,
                                AF918AD6158FC53D002B5D1E /* compass.xml in Resources */,
                                AF918B34158FC53D002B5D1E /* menger.xml in Resources */,
                                AF918B35158FC53D002B5D1E /* metaballs.xml in Resources */,
                                AF918B36158FC53D002B5D1E /* mirrorblob.xml in Resources */,
+                               AF7ACFDA19FF0BA600BD752B /* geodesicgears.xml in Resources */,
                                AF918B38158FC53D002B5D1E /* moebius.xml in Resources */,
                                AF918B39158FC53D002B5D1E /* moebiusgears.xml in Resources */,
                                AF918B3A158FC53D002B5D1E /* moire.xml in Resources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AF5C9B081A0CCE6E00B0147A /* Rez */ = {
+                       isa = PBXRezBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AF642401099FF9C2000F4CD4 /* Rez */ = {
                        isa = PBXRezBuildPhase;
                        buildActionMask = 2147483647;
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AF73FF311A09877F00E485E9 /* Rez */ = {
+                       isa = PBXRezBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AF75110D1782B5B900380EA1 /* Rez */ = {
                        isa = PBXRezBuildPhase;
                        buildActionMask = 2147483647;
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AF7ACFCF19FF0A9200BD752B /* Rez */ = {
+                       isa = PBXRezBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AF975739099C317000B05160 /* Rez */ = {
                        isa = PBXRezBuildPhase;
                        buildActionMask = 2147483647;
                        shellScript = "$SOURCE_ROOT/OSX/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
                        showEnvVarsInLog = 0;
                };
+               AF4E1D1819CE7013002B6190 /* Update GC build settings */ = {
+                       isa = PBXShellScriptBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       inputPaths = (
+                       );
+                       name = "Update GC build settings";
+                       outputPaths = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+                       shellPath = /bin/sh;
+                       shellScript = "#!/bin/sh\n\n# Edit the contents of \"xscreensaver.xcconfig\" based on the running\n# Xcode version.  If we are running Xcode 5.0.2, we *must* turn on GC.\n# If we are running a newer version of Xcode than that, we *cannot*\n# turn on GC.\n\nTMP=`mktemp -t xcode`\nSRC=\"$SRCROOT/OSX/xscreensaver.xcconfig\"\nOBJC_GC_CFLAGS=\nif [ \"$XCODE_VERSION_MAJOR\" -lt \"0600\" ]; then\n  OBJC_GC_CFLAGS=\"-fobjc-gc\"\nfi\n\nrm -f \"$TMP\"\nsed -e \"s/^\\(OBJC_GC_CFLAGS=\\).*/\\1${OBJC_GC_CFLAGS}/\" < $SRC > $TMP\nif ! ( cmp -s \"$SRC\" \"$TMP\" ); then\necho \"$SRC updated:\"\n  diff -U0 \"$SRC\" \"$TMP\"\n  cat \"$TMP\" > \"$SRC\"\nelse\n  echo \"$SRC unchanged\"\nfi\n\nrm -f \"$TMP\"\nexit 0\n";
+                       showEnvVarsInLog = 0;
+               };
                AF4FD6F60CE7A486005EE58E /* Run Update Info Plist */ = {
                        isa = PBXShellScriptBuildPhase;
                        buildActionMask = 2147483647;
                        shellScript = "$SOURCE_ROOT/OSX/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
                        showEnvVarsInLog = 0;
                };
+               AF5C9B091A0CCE6E00B0147A /* Run Update Info Plist */ = {
+                       isa = PBXShellScriptBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       inputPaths = (
+                       );
+                       name = "Run Update Info Plist";
+                       outputPaths = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+                       shellPath = /bin/sh;
+                       shellScript = "$SOURCE_ROOT/OSX/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+                       showEnvVarsInLog = 0;
+               };
                AF68A48E19196CF800D41CD1 /* Run Update Info Plist */ = {
                        isa = PBXShellScriptBuildPhase;
                        buildActionMask = 2147483647;
                        shellScript = "$SOURCE_ROOT/OSX/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
                        showEnvVarsInLog = 0;
                };
+               AF73FF321A09877F00E485E9 /* Run Update Info Plist */ = {
+                       isa = PBXShellScriptBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       inputPaths = (
+                       );
+                       name = "Run Update Info Plist";
+                       outputPaths = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+                       shellPath = /bin/sh;
+                       shellScript = "$SOURCE_ROOT/OSX/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+                       showEnvVarsInLog = 0;
+               };
                AF75110E1782B5B900380EA1 /* Run Update Info Plist */ = {
                        isa = PBXShellScriptBuildPhase;
                        buildActionMask = 2147483647;
                        shellScript = "$SOURCE_ROOT/OSX/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
                        showEnvVarsInLog = 0;
                };
+               AF7ACFD019FF0A9200BD752B /* Run Update Info Plist */ = {
+                       isa = PBXShellScriptBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       inputPaths = (
+                       );
+                       name = "Run Update Info Plist";
+                       outputPaths = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+                       shellPath = /bin/sh;
+                       shellScript = "$SOURCE_ROOT/OSX/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
+                       showEnvVarsInLog = 0;
+               };
                AF7E080115925EE300D81407 /* ICMP Sanity Check */ = {
                        isa = PBXShellScriptBuildPhase;
                        buildActionMask = 2147483647;
                        shellScript = "$SOURCE_ROOT/OSX/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX";
                        showEnvVarsInLog = 0;
                };
+               AF94E7421A16F66900289B93 /* Update Function Table */ = {
+                       isa = PBXShellScriptBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       inputPaths = (
+                       );
+                       name = "Update Function Table";
+                       outputPaths = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+                       shellPath = /bin/sh;
+                       shellScript = "$SOURCE_ROOT/OSX/build-fntable.pl $SOURCE_ROOT/OSX/ios-function-table.m";
+               };
                AF998EEA0A083DB30051049D /* Run Update Info Plist */ = {
                        isa = PBXShellScriptBuildPhase;
                        buildActionMask = 2147483647;
                        isa = PBXSourcesBuildPhase;
                        buildActionMask = 2147483647;
                        files = (
+                               AFE943B119DD54C1000A5E6D /* xft.c in Sources */,
+                               AFE943B519DDF97F000A5E6D /* utf8wc.c in Sources */,
                                AF4808C5098C3BDC00FB32B8 /* colors.c in Sources */,
                                AF4808C6098C3BDF00FB32B8 /* erase.c in Sources */,
                                AF4808C7098C3BE600FB32B8 /* hsv.c in Sources */,
                                AFA55866099324D800F3E977 /* minixpm.c in Sources */,
                                AFA55A530993353500F3E977 /* gllist.c in Sources */,
                                AFA55A95099336D800F3E977 /* normals.c in Sources */,
-                               AFA55C570993482800F3E977 /* glxfonts.c in Sources */,
                                AFDA11271934424D003D397F /* thread_util.c in Sources */,
                                AF975C93099C929800B05160 /* xpm-pixmap.c in Sources */,
                                AF4774E8099D8D8C001F091E /* logo.c in Sources */,
                                AF77783709B6518400EA3033 /* texfont.c in Sources */,
                                AF77783A09B651AF00EA3033 /* glut_stroke.c in Sources */,
                                AF77783D09B651C700EA3033 /* glut_swidth.c in Sources */,
-                               AF7778C609B65CFE00EA3033 /* font-ximage.c in Sources */,
                                AFAD462309D5F4DA00AB5F95 /* grabclient.c in Sources */,
                                AF6048FB157C07C600CA21E4 /* jwzgles.c in Sources */,
                                AFC7592D158D8E8B00C5458E /* textclient.c in Sources */,
                                AFC75930158D9A7A00C5458E /* iostextclient.m in Sources */,
                                AF561DF615969BC3007CA5ED /* iosgrabimage.m in Sources */,
+                               CE9289D319BD00E300961F22 /* async_netdb.c in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AF5C9AFE1A0CCE6E00B0147A /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AF5C9B131A0CCF4E00B0147A /* cityflow.c in Sources */,
+                               AF5C9AFF1A0CCE6E00B0147A /* dangerball.c in Sources */,
+                               AF5C9B001A0CCE6E00B0147A /* XScreenSaverSubclass.m in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AF6423F7099FF9C2000F4CD4 /* Sources */ = {
                        isa = PBXSourcesBuildPhase;
                        buildActionMask = 2147483647;
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AF73FF271A09877F00E485E9 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AF73FF391A09889700E485E9 /* binaryring.c in Sources */,
+                               AF73FF291A09877F00E485E9 /* XScreenSaverSubclass.m in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AF7511041782B5B900380EA1 /* Sources */ = {
                        isa = PBXSourcesBuildPhase;
                        buildActionMask = 2147483647;
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               AF7ACFC519FF0A9200BD752B /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AF7ACFC719FF0A9200BD752B /* XScreenSaverSubclass.m in Sources */,
+                               AF7ACFD719FF0B7A00BD752B /* geodesicgears.c in Sources */,
+                               AFDDCCEC19FF0D170072365B /* involute.c in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                AF918985158FC00A002B5D1E /* Sources */ = {
                        isa = PBXSourcesBuildPhase;
                        buildActionMask = 2147483647;
                                AF918999158FC310002B5D1E /* asm6502.c in Sources */,
                                AF91899A158FC310002B5D1E /* attraction.c in Sources */,
                                AF91899B158FC310002B5D1E /* barcode.c in Sources */,
+                               AF73FF3A1A09889700E485E9 /* binaryring.c in Sources */,
                                AF91899C158FC310002B5D1E /* blaster.c in Sources */,
                                AF91899D158FC310002B5D1E /* blitspin.c in Sources */,
                                AF91899E158FC310002B5D1E /* boxfit.c in Sources */,
                                AF918A38158FC3BB002B5D1E /* carousel.c in Sources */,
                                AF918A39158FC3BB002B5D1E /* chessmodels.c in Sources */,
                                AF918A3A158FC3BB002B5D1E /* circuit.c in Sources */,
+                               AF5C9B141A0CCF4E00B0147A /* cityflow.c in Sources */,
                                AF9189A6158FC310002B5D1E /* companion.c in Sources */,
                                AF9189A7158FC311002B5D1E /* companion_disc.c in Sources */,
                                AF9189A8158FC311002B5D1E /* companion_heart.c in Sources */,
                                AF918A55158FC3E5002B5D1E /* flipscreen3d.c in Sources */,
                                AF918A56158FC3E5002B5D1E /* fliptext.c in Sources */,
                                AF918A57158FC3E5002B5D1E /* flyingtoasters.c in Sources */,
-                               AF918A58158FC3E5002B5D1E /* font-ximage.c in Sources */,
                                AF918A59158FC3E5002B5D1E /* fps-gl.c in Sources */,
                                AF918A5A158FC3E5002B5D1E /* gears.c in Sources */,
+                               AFDDCCED19FF0EBD0072365B /* geodesicgears.c in Sources */,
                                AF918A5B158FC3E5002B5D1E /* gflux.c in Sources */,
                                AF918A5C158FC3E5002B5D1E /* glblur.c in Sources */,
                                AF918A5D158FC3E5002B5D1E /* glcells.c in Sources */,
                        files = (
                                AFA55983099331C300F3E977 /* moebius.c in Sources */,
                                AF9CCABF09959D2E0075E99B /* XScreenSaverSubclass.m in Sources */,
-                               AF7778C409B65CFE00EA3033 /* font-ximage.c in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                        files = (
                                AFA55A1B0993345900F3E977 /* stairs.c in Sources */,
                                AF9CCAC209959D3C0075E99B /* XScreenSaverSubclass.m in Sources */,
-                               AF7778C509B65CFE00EA3033 /* font-ximage.c in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                        target = AF4FF4BA0D52CBDE00666F98 /* CubicGrid */;
                        targetProxy = AF4FF4D60D52CD0D00666F98 /* PBXContainerItemProxy */;
                };
+               AF5C9AFA1A0CCE6E00B0147A /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+                       targetProxy = AF5C9AFB1A0CCE6E00B0147A /* PBXContainerItemProxy */;
+               };
+               AF5C9B161A0CCF8000B0147A /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = AF5C9AF91A0CCE6E00B0147A /* Cityflow */;
+                       targetProxy = AF5C9B151A0CCF8000B0147A /* PBXContainerItemProxy */;
+               };
                AF6423F3099FF9C2000F4CD4 /* PBXTargetDependency */ = {
                        isa = PBXTargetDependency;
                        target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
                        target = AFD570C90996B9F800BA26F7 /* Ant */;
                        targetProxy = AF714E50105613580046AB1D /* PBXContainerItemProxy */;
                };
+               AF73FF231A09877F00E485E9 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+                       targetProxy = AF73FF241A09877F00E485E9 /* PBXContainerItemProxy */;
+               };
+               AF73FF3F1A0988F000E485E9 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = AF73FF221A09877F00E485E9 /* BinaryRing */;
+                       targetProxy = AF73FF3E1A0988F000E485E9 /* PBXContainerItemProxy */;
+               };
                AF7511001782B5B900380EA1 /* PBXTargetDependency */ = {
                        isa = PBXTargetDependency;
                        target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
                        target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
                        targetProxy = AF794FCF09974FA60059A8B0 /* PBXContainerItemProxy */;
                };
+               AF7ACFC119FF0A9200BD752B /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
+                       targetProxy = AF7ACFC219FF0A9200BD752B /* PBXContainerItemProxy */;
+               };
+               AF7ACFDC19FF0BDB00BD752B /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = AF7ACFC019FF0A9200BD752B /* GeodesicGears */;
+                       targetProxy = AF7ACFDB19FF0BDB00BD752B /* PBXContainerItemProxy */;
+               };
                AF7E07FE15925DF200D81407 /* PBXTargetDependency */ = {
                        isa = PBXTargetDependency;
                        target = AF4FF4930D52CA0800666F98 /* m6502.h */;
                        target = AF4808C0098C3B6C00FB32B8 /* jwxyz */;
                        targetProxy = AF9D4DEE09B5BB19006E59CF /* PBXContainerItemProxy */;
                };
-               AF9E7EDF190F4F7200A8B01F /* PBXTargetDependency */ = {
-                       isa = PBXTargetDependency;
-                       target = AF9E7EBE190F4C1B00A8B01F /* enable_gc */;
-                       targetProxy = AF9E7EDE190F4F7200A8B01F /* PBXContainerItemProxy */;
-               };
                AFA160921052FF87009B93AA /* PBXTargetDependency */ = {
                        isa = PBXTargetDependency;
                        target = AF6425CC09A18855000F4CD4 /* HyperCube */;
                };
                AFA33C040B058E3C002B0E7D /* PBXTargetDependency */ = {
                        isa = PBXTargetDependency;
-                       target = AFA33C020B058E17002B0E7D /* webcollage */;
+                       target = AFA33C020B058E17002B0E7D /* webcollage-perl */;
                        targetProxy = AFA33C030B058E3C002B0E7D /* PBXContainerItemProxy */;
                };
                AFA55947099330B000F3E977 /* PBXTargetDependency */ = {
                                BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.updater";
                                FRAMEWORK_SEARCH_PATHS = (
                                        "$(inherited)",
-                                       /Users/jwz/src/xscreensaver/OSX,
+                                       "$(SRCROOT)/OSX",
                                );
                                INFOPLIST_FILE = "$(SRCROOT)/OSX/Updater.plist";
                                "OTHER_CFLAGS[sdk=macosx*]" = "-fno-objc-gc";
                                BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.updater";
                                FRAMEWORK_SEARCH_PATHS = (
                                        "$(inherited)",
-                                       /Users/jwz/src/xscreensaver/OSX,
+                                       "$(SRCROOT)/OSX",
                                );
                                INFOPLIST_FILE = "$(SRCROOT)/OSX/Updater.plist";
                                "OTHER_CFLAGS[sdk=macosx*]" = "-fno-objc-gc";
                        };
                        name = Release;
                };
+               AF5C9B0B1A0CCE6E00B0147A /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+                                       "USE_GL=1",
+                                       "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+                               );
+                               "OTHER_LDFLAGS[sdk=macosx*]" = (
+                                       "-ljwxyz",
+                                       "-framework",
+                                       ScreenSaver,
+                                       "-framework",
+                                       Cocoa,
+                                       "-framework",
+                                       Carbon,
+                                       "-framework",
+                                       AGL,
+                                       "-framework",
+                                       OpenGL,
+                               );
+                       };
+                       name = Debug;
+               };
+               AF5C9B0C1A0CCE6E00B0147A /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+                                       "USE_GL=1",
+                                       "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+                               );
+                               "OTHER_LDFLAGS[sdk=macosx*]" = (
+                                       "-ljwxyz",
+                                       "-framework",
+                                       ScreenSaver,
+                                       "-framework",
+                                       Cocoa,
+                                       "-framework",
+                                       Carbon,
+                                       "-framework",
+                                       AGL,
+                                       "-framework",
+                                       OpenGL,
+                               );
+                       };
+                       name = Release;
+               };
                AF642403099FF9C2000F4CD4 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
                        };
                        name = Release;
                };
+               AF73FF341A09877F00E485E9 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               PRODUCT_NAME = BinaryRing;
+                       };
+                       name = Debug;
+               };
+               AF73FF351A09877F00E485E9 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               PRODUCT_NAME = BinaryRing;
+                       };
+                       name = Release;
+               };
                AF7511101782B5B900380EA1 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
                        };
                        name = Release;
                };
+               AF7ACFD219FF0A9200BD752B /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+                                       "USE_GL=1",
+                                       "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+                               );
+                               "OTHER_LDFLAGS[sdk=macosx*]" = (
+                                       "-ljwxyz",
+                                       "-framework",
+                                       ScreenSaver,
+                                       "-framework",
+                                       Cocoa,
+                                       "-framework",
+                                       Carbon,
+                                       "-framework",
+                                       AGL,
+                                       "-framework",
+                                       OpenGL,
+                               );
+                               PRODUCT_NAME = GeodesicGears;
+                       };
+                       name = Debug;
+               };
+               AF7ACFD319FF0A9200BD752B /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
+                                       "USE_GL=1",
+                                       "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)",
+                               );
+                               "OTHER_LDFLAGS[sdk=macosx*]" = (
+                                       "-ljwxyz",
+                                       "-framework",
+                                       ScreenSaver,
+                                       "-framework",
+                                       Cocoa,
+                                       "-framework",
+                                       Carbon,
+                                       "-framework",
+                                       AGL,
+                                       "-framework",
+                                       OpenGL,
+                               );
+                               PRODUCT_NAME = GeodesicGears;
+                       };
+                       name = Release;
+               };
                AF91898D158FC00A002B5D1E /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
                                "GCC_WARN_64_TO_32_BIT_CONVERSION[arch=*64]" = NO;
                                INFOPLIST_FILE = OSX/iSaverRunner.plist;
                                INSTALL_PATH = "$(HOME)/Applications";
+                               IPHONEOS_DEPLOYMENT_TARGET = 7.0;
                                PRODUCT_NAME = XScreenSaver;
                                PROVISIONING_PROFILE = "";
                                SDKROOT = iphoneos;
                                "GCC_WARN_64_TO_32_BIT_CONVERSION[arch=*64]" = NO;
                                INFOPLIST_FILE = OSX/iSaverRunner.plist;
                                INSTALL_PATH = "$(HOME)/Applications";
+                               IPHONEOS_DEPLOYMENT_TARGET = 7.0;
                                PRODUCT_NAME = XScreenSaver;
                                PROVISIONING_PROFILE = "";
                                SDKROOT = iphoneos;
                };
                C01FCF4F08A954540054247B /* Debug */ = {
                        isa = XCBuildConfiguration;
+                       baseConfigurationReference = AF94E7411A16E93600289B93 /* xscreensaver.xcconfig */;
                        buildSettings = {
                                ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
                                BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.${PRODUCT_NAME:rfc1034identifier}";
                                        "HAVE_FORKPTY=1",
                                        "HAVE_UTIL_H=1",
                                        "HAVE_PTHREAD=1",
+                                       "HAVE_GETADDRINFO=1",
+                                       "HAVE_STRUCT_SOCKADDR_SA_LEN=1",
+                                       "HAVE_XUTF8DRAWSTRING=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS)",
                                );
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                IPHONEOS_DEPLOYMENT_TARGET = 5.1.1;
                                LIBRARY_SEARCH_PATHS = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)";
                                MACOSX_DEPLOYMENT_TARGET = 10.4;
+                               ONLY_ACTIVE_ARCH = YES;
                                OTHER_CFLAGS = "";
-                               "OTHER_CFLAGS[sdk=macosx*]" = "-fobjc-gc";
+                               "OTHER_CFLAGS[sdk=macosx*]" = "$(OBJC_GC_CFLAGS)";
                                "OTHER_LDFLAGS[sdk=macosx*]" = "-headerpad_max_install_names";
                                PRODUCT_NAME = "$(TARGET_NAME)";
+                               PROVISIONING_PROFILE = "A33D2D59-2A1E-4D45-8AA1-CB2EC74F9DCC";
                                SDKROOT = macosx;
                                "SDKROOT[arch=arm*]" = iphoneos;
                                SYMROOT = OSX/build;
                };
                C01FCF5008A954540054247B /* Release */ = {
                        isa = XCBuildConfiguration;
+                       baseConfigurationReference = AF94E7411A16E93600289B93 /* xscreensaver.xcconfig */;
                        buildSettings = {
                                ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
                                BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.${PRODUCT_NAME:rfc1034identifier}";
                                        "HAVE_FORKPTY=1",
                                        "HAVE_UTIL_H=1",
                                        "HAVE_PTHREAD=1",
+                                       "HAVE_GETADDRINFO=1",
+                                       "HAVE_STRUCT_SOCKADDR_SA_LEN=1",
+                                       "HAVE_XUTF8DRAWSTRING=1",
                                        "$(GCC_PREPROCESSOR_DEFINITIONS)",
                                );
                                GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = (
                                "LLVM_LTO[sdk=macosx*]" = YES;
                                MACOSX_DEPLOYMENT_TARGET = 10.4;
                                OTHER_CFLAGS = "";
-                               "OTHER_CFLAGS[sdk=macosx*]" = "-fobjc-gc";
+                               "OTHER_CFLAGS[sdk=macosx*]" = "$(OBJC_GC_CFLAGS)";
                                "OTHER_LDFLAGS[sdk=macosx*]" = "-headerpad_max_install_names";
                                PRODUCT_NAME = "$(TARGET_NAME)";
+                               PROVISIONING_PROFILE = "A33D2D59-2A1E-4D45-8AA1-CB2EC74F9DCC";
                                SDKROOT = macosx;
                                "SDKROOT[arch=arm*]" = iphoneos;
                                SYMROOT = OSX/build;
                        defaultConfigurationIsVisible = 0;
                        defaultConfigurationName = Release;
                };
+               AF5C9B0A1A0CCE6E00B0147A /* Build configuration list for PBXNativeTarget "Cityflow" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               AF5C9B0B1A0CCE6E00B0147A /* Debug */,
+                               AF5C9B0C1A0CCE6E00B0147A /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
                AF642402099FF9C2000F4CD4 /* Build configuration list for PBXNativeTarget "Extrusion" */ = {
                        isa = XCConfigurationList;
                        buildConfigurations = (
                        defaultConfigurationIsVisible = 0;
                        defaultConfigurationName = Release;
                };
+               AF73FF331A09877F00E485E9 /* Build configuration list for PBXNativeTarget "BinaryRing" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               AF73FF341A09877F00E485E9 /* Debug */,
+                               AF73FF351A09877F00E485E9 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
                AF75110F1782B5B900380EA1 /* Build configuration list for PBXNativeTarget "Kaleidocycle" */ = {
                        isa = XCConfigurationList;
                        buildConfigurations = (
                        defaultConfigurationIsVisible = 0;
                        defaultConfigurationName = Release;
                };
+               AF7ACFD119FF0A9200BD752B /* Build configuration list for PBXNativeTarget "GeodesicGears" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               AF7ACFD219FF0A9200BD752B /* Debug */,
+                               AF7ACFD319FF0A9200BD752B /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
                AF91898C158FC00A002B5D1E /* Build configuration list for PBXNativeTarget "XScreenSaver-iOS" */ = {
                        isa = XCConfigurationList;
                        buildConfigurations = (
                        defaultConfigurationIsVisible = 0;
                        defaultConfigurationName = Release;
                };
-               AFA33C070B058E67002B0E7D /* Build configuration list for PBXAggregateTarget "webcollage" */ = {
+               AFA33C070B058E67002B0E7D /* Build configuration list for PBXAggregateTarget "webcollage-perl" */ = {
                        isa = XCConfigurationList;
                        buildConfigurations = (
                                AFA33C080B058E67002B0E7D /* Debug */,